这是我们拥有的文本文件:
文件1.txt
A B C D
4 9
5 8
文件2.txt:
H I J K L M N O P Q R
1 2 3 5 8 9 5 3 3 2 4
4 7 8 9 5 6 8 9 0 8 7
7 8 0 7 4 7 7 9 0 6 7
2 7 9 5 7 9 0 7 6 5 4
当 file1.txt 中的 A 列与 file2.txt 中的 L 列匹配时,我想从 file2.txt 中提取两列(H 和 N),并且要显示的输出文本文件应如下所示:
输出.txt
A B C D
4 9 7 7
5 8 4 8
我怎样才能做到这一点?
答案1
使用 grep 不可能,但使用 awk 可以:
$ awk 'NR==1 {print $0;next} # Print header
NR==FNR {a[$1]=$2;next} # collect data from file1.txt
{ if($5 in a) # If column L match
{ print($5,a[$5],$1,$7) } # print columns (H and N)
}
' file1.txt file2.txt
作为单行:
$ awk 'NR==1{print $0;next} NR==FNR{a[$1]=$2;next} {if($5 in a){print($5,a[$5],$1,$7)}}' file1.txt file2.txt
A B C D
5 8 4 8
4 9 7 7
顺序与字段中出现的顺序相同file2.txt
。
如果您需要排序,请添加排序步骤。
答案2
我会用一步一步的方法来解释
对文件进行排序 1
sort file1.txt > file1.sorted.txt
从 file2 中取出有趣的部分(并对其进行排序)
awk '{print $5,$1,$7}' file2.txt | sort > file2_of_interest.txt
根据键(两个文件中的第 1 列)连接两个输出
join file1.sorted.txt file2_of_interest.txt -1 1 -2 1
您可以使用间接方式组合这三个步骤 - 但最终您需要完成至少一个文件的解析。还会有人担心 file2.txt 中的 L 列不唯一和/或 file1.txt 中的第 1 列不唯一 - 您需要通过放入业务逻辑以使键唯一来解决这些问题。