Shell

根據文件 1 中特定模式的位置,基於第一列合併兩個文件

  • September 11, 2021

我有以下文件:

文件 1(約 7000 行):

1010089 1402 6814 5543
1010121 6948 1402 2344
1305789 7589 7890 1402
3456889 1254 7389 1256

文件 2(大約 300k 行):

1010089 26 48 33
1010121 21 62 49

我想根據文件 1 中的 1402-s 位置基於第一列合併兩個文件。例如,如果 1402 在第二列中,我想列印文件 1 的第一列,文件的第二列1和文件2的第二列。如果1402在第三列,我想列印文件1的第一列,文件1的第三列和文件2的第三列。

1402 可以出現在任何列中,而不僅是在第二列或第三列。但是,它不會出現超過一次/行。如果 $ 1 from file 2 does not include $ 文件 1 的 1,我想列印 $1,1402 和未知。

期望的輸出:

1010089 1402 26
1010121 1402 62
1305789 1402 unknown
3456889 0000 unknown

我使用以下腳本合併這兩個文件:

awk 'FNR==NR{arr[$1]=$2;next} ($1 in arr){print $0,arr[$1]}' file2 file1

如果我知道 file1、file2 和每一列代表什麼,我會想出連字元變數名,但我不知道……在每個 Unix 機器上的任何 shell 中使用任何 awk:

$ cat tst.awk
BEGIN { tgt = 1402 }
NR == FNR {
   file2[$1] = $0
   next
}
{
   fld = "0000"
   val = "unknown"
   for ( i=2; i<=NF; i++ ) {
       if ( $i == tgt ) {
           fld = $i
           if ( $1 in file2 ) {
               split(file2[$1],f)
               val = f[i]
           }
           break
       }
   }
   print $1, fld, val
}
$ awk -f tst.awk file2 file1
1010089 1402 26
1010121 1402 62
1305789 1402 unknown
3456889 0000 unknown

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