在 Bash 中,如何使用分隔符號將行列印成一行?

在 Bash 中,如何使用分隔符號將行列印成一行?

我收集了 3 個欄位的資料。我想將第三個字段資料列印到一行中。這是我得到的數據。

$ 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

相關內容