AWK:在 TABLE 文本中搜索 INPUT.txt 的最后一列,并将相应的列添加到 INPUT.txt

AWK:在 TABLE 文本中搜索 INPUT.txt 的最后一列,并将相应的列添加到 INPUT.txt

亲爱的大家,我有这样的 INPUT.txt (看最后一栏)

INPUT.txt
63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

和两个像这样的表格文本。有两列。

TABLE1.txt
j feat1
a feat2
.
.
.

TABLE2.txt
j sp1
a sp2
.
.

我想向 INPUT.txt 添加两列。在 TABLE 文本中搜索 INPUT.txt 的最后一列,并将相应的列添加到 INPUT.txt。 (我认为可以合并像 j feat1 sp1 这样的表)并像这样输出

output.txt
CodeGender Age Grade Dialect Session Sentence Start End Length Phonemic     Phonetic feat sp
63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]
.
.
.

答案1

如果您有 GNU awk,那么您可以使用规范的多维版本NR==FNR {a[$1]=$2; next} $NF in a {print $0, a[$NF]}并进行以下修改:

  1. 你不能使用这个NR==FNR技巧来决定是构建查找表还是使用它;您需要计算已处理的文件数量

  2. 您将需要显式循环主索引并测试每个子数组中的匹配键

前任。

gawk '
  BEGINFILE{k++}
  k<3 {a[k][$1]=$2; next} 
  {nf = NF; for (l in a) {if ($nf in a[l]) {$(NF+1) = a[l][$nf]}}}
  {print}
' TABLE1.txt TABLE2.txt INPUT.txt 

63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

如果您需要列标题,请在BEGIN规则中打印它们。

答案2

你也可以试试这个 awk

awk '
FILENAME!=fn{
  a[$1]=a[$1]FS$2
  next
}
$NF in a{
  $0=$0a[$NF]
}
1
' fn='INPUT.txt' TABLE1.txt TABLE2.txt INPUT.txt

答案3

我通过以下 2 个步骤完成了此操作

步骤1

awk 'FNR==NR{a[FNR]=$2;next};{$(NF + 1)=a[FNR]}1' file1 input.txt  >> final_final.txt

第2步

awk 'FNR==NR{a[FNR]=$2;next};{$(NF + 1)=a[FNR]}1' file2 final_final.txt

输出

63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

相关内容