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)
谢谢,
用 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)
NR
当awk读取第一条记录时设置为 1,并为每个下一个读取单个或多个输入文件的记录递增,直到所有读取完成。FNR
当awk读取第一条记录时设置为 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] }
,打印$0
file1 中的当前记录,并且当它不是空行时看到的数组中存在与 column$6 和 column$7 匹配的值。