加入两个文件,在某些列中添加值

paw*_*ana 3 command-line text-processing

像 VLOOKUP 一样匹配另一个文件中 2 列的值后,如何添加另外 2 个值?

示例如下。文件 1 中第 6 和 7 列的值与文件 2 中的第 1 和 2 列匹配时,会将文件 1 中的第 9 和 10 列与文件 2 中第 3 和 4 列的值相加。

文件1.txt

1 1 1 1 1 5 9 1

2 2 2 2 2 7 8 2

3 3 3 3 3 7 7 3

4 4 4 4 4 8 6 4
Run Code Online (Sandbox Code Playgroud)

文件2.txt

5 9 A B

8 6 E F

7 7 G H

7 8 C D
Run Code Online (Sandbox Code Playgroud)

输出.txt

1 1 1 1 1 5 9 1 A B

2 2 2 2 2 7 8 2 C D

3 3 3 3 3 7 7 3 G H

4 4 4 4 4 8 6 4 E F
Run Code Online (Sandbox Code Playgroud)

谢谢,

αғs*_*нιη 6

awk

awk 'NR==FNR{ seen[$1FS$2]=$3FS$4; next } { print $0, seen[$6FS$7] }' file2 file1
Run Code Online (Sandbox Code Playgroud)

并从输出中删除空行:

awk 'NR==FNR{ seen[$1FS$2]=$3FS$4; next } NF{ print $0, seen[$6FS$7] }' file2 file1
Run Code Online (Sandbox Code Playgroud)

或者一点空白和合理的变量名称对可读性大有帮助。另外,利用在数组键中使用逗号

awk '
    NR == FNR {value[$1,$2] = $3 OFS $4; next} 
    {print $0, value[$6,$7]}
' file2.txt file1.txt
Run Code Online (Sandbox Code Playgroud)
  • NRawk读取第一条记录时设置为 1,并为每个下一个读取单个或多个输入文件的记录递增,直到所有读取完成。
  • FNRawk读取第一条记录时设置为 1,并为当前文件中读取的每个下一个记录递增,如果有多个输入文件,则为下一个输入文件重置回 1。
  • soNR == FNR总是一个真实的条件,后面的块将只对第一个文件执行操作。

  • seen是一个关联AWK阵列用柱$ 1和$柱2与柱$ 3和柱$ 4的值的组合键。

  • 所述next令牌跳到执行的命令的休息和那些只用于除了第一下一个文件(一个或多个)实际执行。

  • NF; 预置Ñ的棕土˚F在字段是已知的,并用一个分离的记录ields ˚F ield小号eparator FS; 因此FS在列之间用于完整字段分隔符,或者您可以,在数组中使用逗号。

  • 所以这个NF{ print $0, seen[$6FS$7] },打印$0file1 中的当前记录,并且当它不是空行时看到的数组中存在与 column$6 和 column$7 匹配的值。