最大2000行の次のパターンを含むファイルがあります。パターンは3行のセットごとに異なる数値で繰り返されますが、開始テキスト値はファイルの終わりまで共通です。
ここでは3行をマージする必要があります。
次のように入力してください
ABC 1223334
Days 344678544324677
Base 45666
ABC 1234565
Days 234567899765443
Base 456643
次の出力が必要です。
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643
答え1
これは、入力が Unix テキスト形式であると仮定します。 DOS/Windows のテキスト形式ファイルを使用する場合は、まずdos2unix
次のようにします。
タブ区切り出力の場合:
$ paste - - - <file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643
スペースで区切られた出力の場合:
$ paste -d ' ' - - - <file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643
上記のように、3つのダッシュでこのpaste
コマンドを使用すると、3つの出力列が生成されます。各列は入力の行から読み取られます。デフォルトでは、列はタブまたはオプション引数として使用される文字で区切られています-d
。
答え2
このようにしてくださいアッ:
awk '{if (NR % 3 == 0) {print}else{printf "%s ", $0}}' file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643
答え3
すべてのレコードに3つの行があると仮定するのではなく、最初のフィールドが最初のレコードの最初のフィールドと一致するときに前のレコードがいっぱいであることを確認できます。
awk '
{
if (NR == 1)
first = $1 ""
else if ($1 == first)
sep = ORS
else
sep = OFS
printf "%s", sep $0
}
END {if (NR) printf "%s", ORS}'
答え4
シンプルなシェルループを使って、
while IFS= read -r a && IFS= read -r b && IFS= read -r c
do
printf "%s %s %s\n" "$a" "$b" "$c"
done
出力
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643