私のファイルの例は次のとおりです。
201012,720,201011,119,201710,16
私が望む出力:
201012,720
201011,119
201710,16
答え1
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
\n
BSDはコマンドの右側の改行文字を理解していませんs
。これはksh、bash、zshシェルのソリューションです。
sed -e :a -e $'s/,/\\\n/2' -e 'P;D' file
または(以前の)sedを使用した一般的な解決策は次のとおりです。
sed '
:a
s/,/\
/2
P;D
' file
答え2
$ 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/'
同じことを行います。
答え3
次の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
答え4
使用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
合理的な最大値まで増加すると、速度が速くなる可能性があります。でも数字、例えば入力数が15桁を超えないとします。
m=$(getconf ARG_MAX) m=$(( (m/16) + (m%2) ))
tr , '\n' < file | xargs -n"${m}" printf '%s,%s\n' | sed '$s/,$//'