私のファイルの例は次のようになります:
201012,720,201011,119,201710,16
私が欲しい出力:
201012,720
201011,119
201710,16
Sedループを使用:
sed -e 's/,/\n/2' -e 'P;D' file
例.
$ echo '201012,720,201011,119,201710,16' | sed -e 's/,/\n/2' -e 'P;D'
201012,720
201011,119
201710,16
これにより、2番目の,
が\n
に置き換えられ、置換が成功しなくなるまで繰り返し\n
が出力および削除されます。
BSDは、改行をs
コマンドの右側の\n
として理解しません。これは、ksh、bash、zshシェルの回避策です。
sed -e :a -e $'s/,/\\\n/2' -e 'P;D' file
または、(古い)sedsの一般的な解決策:
sed '
:a
s/,/\
/2
P;D
' file
$ paste -d, - - < <( tr ',' '\n' <file )
201012,720
201011,119
201710,16
または、プロセス置換なしで、
$ tr ',' '\n' <file | paste -d, - -
201012,720
201011,119
201710,16
これは、tr
を使用してファイル内のすべてのコンマを改行で置き換え、次にpaste
を使用して、コンマで区切られた2つの列を作成します。
tr
が少し単純すぎると感じた場合は、同じことを行うsed 'y/,/\n/'
に置き換えることができます。
私は次のawkコマンドでこれを達成することができました:
awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input
これは、入力の各列をループし(反復ごとに2ずつ増加)、その列と次の隣接する列を行に出力してから、次の列に移動します。
$ cat input
201012,720,201011,119,201710,16
$ awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input
201012,720
201011,119
201710,16
xargs
およびprintf
の使用:
xargs -d, printf '%s,%s\n' < file
出力:
201012,720
201011,119
201710,16
上記のコードは、各行に偶数のフィールドがあることを前提としています。そうでない場合、xargs
は、孤立した数とダングリングコンマを出力します。しかし、このいくらか遅いコードは、ほとんどすべてのものを通過させるはずです。
tr , '\n' < file | xargs -n2 printf '%s,%s\n' | sed '$s/,$//'
-n2
をある程度の最大値まで増やすことでスピードアップできますeven number、e.g。入力の数値が15桁を超えていないとします。
m=$(getconf ARG_MAX) m=$(( (m/16) + (m%2) ))
tr , '\n' < file | xargs -n"${m}" printf '%s,%s\n' | sed '$s/,$//'
別のsed
ソリューション:
sed 's/\([^,]*,[^,]*\),/\1\n/g' file
これにより、2番目のカンマが改行に置き換えられます。
grep
を使用できます-すべてのバージョンが-o
をサポートしているわけではなく、これが奇数のフィールドでは機能しないことに注意してください
grep -E -o '[^,]+,[^,]+' file
または、やりすぎ
gawk 'BEGIN{FPAT="[^,]+,[^,]+";OFS="\n"}; {$1=$1; print}' file
awk -F'\n' -vRS=, '{l=$1; $0=""; getline; print l RS $1}'
または
awk -F'\n' -vRS=, '{print $1 RS (getline > 0 ? $1 : "")}'
フィールドにスペースが含まれていない場合は、-F'\n'
を省略できます。または、フィールドに改行が含まれる可能性がある場合(たとえば、-F,
を使用して)、レコード区切り文字と同じ値に設定します(たとえば、echo 1,2,3,4
の出力で、最後のフィールドが4\n
ではなく4
である必要があります)。
シェルベース:
_(set -f; IFS=','; printf '%s,%s\n' $(< file))
_
ksh、bash、zshを使用しない場合は$(cat file)
に変更します(つまり、ダッシュ他)。
builtin(ほとんどのシェル)としてprintf
を実装するシェルでは、メモリ(または使用するシェルインスタンスで使用されている他のリソース制限)によって制限されます。または、execve
を呼び出してコマンドラインを実行するシェル(ksh88など)のARG_MAXの値によって。