Awk

使用awk合併列?(或其他建議)

  • November 20, 2015

我正在努力提高效率,需要一個腳本或命令解決方案。

假設我製作了一個包含 2 列的文件,或者製作了包含一列的兩個文件,以更容易者為準:

AA1 B2        ZZ1 YYY XX1
AA2 B2        ZZ2 YYY XX2
AA3 B3        ZZ3 YYY XX3
AA4 B4        ZZ4 YYY XX4
             ZZ5 YYY XX5
             ZZ6 YYY XX6
             ZZ7 YYY XX7

條目的數量是奇數。現在,我想創建一個新文件(最好還有一些其他輸入,儘管讓我們從這裡開始),它將第一列中的每個值與第二列中的每個值結合起來(它們的行數總是不相等) 並將結果輸出為:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
[...]
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2

因此,按順序循環遍歷第 1 列中的所有值,並按順序將它們與第 2 列中的每個值組合。

假設您有以下文件:

$ cat file1
ZZ1 YYY XX1
ZZ2 YYY XX2
ZZ3 YYY XX3
ZZ4 YYY XX4
ZZ5 YYY XX5
ZZ6 YYY XX6
ZZ7 YYY XX7
$ cat file2
AA1 B2
AA2 B2
AA3 B3
AA4 B4

然後使用這個awk

awk 'FNR==NR{a[c++]=$0} FNR!=NR{for(i in a){print $0,a[i]}}' file1 file2
  • FNR==NR僅適用於第一個文件file1
    • a[c++]=$0填充一個名為的數組a,其內容為file1
  • FNR!=NR僅適用於第二個文件file2
    • for(i in a)通過數組循環a
    • print $0,a[i]…並列印來自file2數組的行和內容。

出局:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
AA1 B2 ZZ3 YYY XX3
AA1 B2 ZZ4 YYY XX4
AA1 B2 ZZ5 YYY XX5
AA1 B2 ZZ6 YYY XX6
AA1 B2 ZZ7 YYY XX7
AA2 B2 ZZ1 YYY XX1
AA2 B2 ZZ2 YYY XX2
AA2 B2 ZZ3 YYY XX3
AA2 B2 ZZ4 YYY XX4
AA2 B2 ZZ5 YYY XX5
AA2 B2 ZZ6 YYY XX6
AA2 B2 ZZ7 YYY XX7
AA3 B3 ZZ1 YYY XX1
AA3 B3 ZZ2 YYY XX2
AA3 B3 ZZ3 YYY XX3
AA3 B3 ZZ4 YYY XX4
AA3 B3 ZZ5 YYY XX5
AA3 B3 ZZ6 YYY XX6
AA3 B3 ZZ7 YYY XX7
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2
AA4 B4 ZZ3 YYY XX3
AA4 B4 ZZ4 YYY XX4
AA4 B4 ZZ5 YYY XX5
AA4 B4 ZZ6 YYY XX6
AA4 B4 ZZ7 YYY XX7

引用自:https://unix.stackexchange.com/questions/244352