3つの行を1つにまとめる方法

3つの行を1つにまとめる方法

最大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

関連情報