我想建立一個包含兩個輸入檔案中的列的檔案。文件1就像:
aa 32
bb 15
cc 78
文件2是:
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
任務是,讀取 File1,如果一行的第一個欄位存在於 File2 的第一個欄位中,則列印 File2 的該行,以及兩列,並新增包含第一個欄位的 File1 的第二列條目。
輸出應該是這樣的:
aa 45 32
bb 31 15
cc 50 78
該腳本首選 awk。
答案1
$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78
解釋:
awk
隱式迴圈遍歷每個文件,一次一行。由於我們將其file2
作為第一個參數,因此首先讀取它。 file1
是第二個讀的。
FNR==NR{a[$1]=$2;next}
NR
awk
是迄今為止已讀取的行數, 是目前檔案中迄今已讀取的FNR
行數。awk
因此,如果FNR==NR
,我們仍在讀取第一個命名檔案:file2
。對於 中的每一行file2
,我們分配a[$1]=$2
.這裡,
a
是一個關聯數組表示a[$1]=$2
將 file2 的第二列(表示為 )儲存$2
為陣列中的值,並a
使用 file2 的第一列$1
作為鍵。next
告訴awk
跳過其餘命令並從下一行開始。($1 in a) {print $1,a[$1],$2}
如果我們到達這裡,則表示我們正在讀取第二個檔案:
file1
.如果我們在 中看到該行的第一個欄位file2
(由 array 的內容決定)a
,那麼我們會列印出一行,其中包含兩個檔案中欄位 2 的值。
答案2
我喜歡 awk 解決方案,但我認為這可能更容易:
sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2
此選項-o
將覆蓋您選擇的第一個檔案的第一個欄位、第二個檔案的第二個欄位和第一個檔案的第二個欄位的格式。
答案3
將第二個文件加入File2
第一個文件中,File1
.
join <(sort -k1 file2) <(sort -k1 file1)