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