Bash で、区切り文字を使用して行を 1 行に印刷するにはどうすればよいですか?

Bash で、区切り文字を使用して行を 1 行に印刷するにはどうすればよいですか?

3 つのフィールドでデータを収集しました。3 番目のフィールドのデータを 1 行に印刷します。取得するデータは次のとおりです。

$ cat file
1234  1234  dei_1/3,dei_2/3,dei_9/0,
dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,de
i_9/7,dei_1/3,dei_2/3,dei_9/0

期待される結果:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

これまでに私が持っているコード

while read file; do if [[ $file == 1 ]]; then echo -n; fi; done 

答え1

次のスクリプトは、2 つの数字で始まらない行を前の行と結合します。

$ awk -v ORS="" '$1~/^[0-9]+$/ && $2~/^[0-9]+$/ && NR>1{printf "\n"}1' file
1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

これは、空の文字列にリセットされる (出力レコード区切り文字) に依存しますORS。最初の 2 つのフィールドが数字の場合 (および最初の行でない場合) は、改行が追加されます。

答え2

短いsedアプローチ:

sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)/\1/' file

出力:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

答え3

いくつかの awk アプローチ:

数字で始まる最新の行を保存し、現在の行が数字で始まっていない場合はそれに追加します。

awk '
    /^[[:digit:]]/ {if (prev) print prev; prev=$0; next} 
    {prev = prev $0} 
    END {if (prev) print prev}
' file

ファイルを逆順にします。行が数字以外で始まる場合は、次の行を読み取り、前の行を追加します。結果を逆順にします。レコードは最大で 1 回分割されると想定します。

tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac

関連情報