2番目の","ごとに要素を分離し、bashの次の行にプッシュします。

2番目の","ごとに要素を分離し、bashの次の行にプッシュします。

私のファイルの例は次のとおりです。

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

\nBSDはコマンドの右側の改行文字を理解していません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

使用xargsprintf:

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/,$//'

関連情報