如何 grep 不同文件中具有相同列的行并打印特定列并添加到原始文件中?

如何 grep 不同文件中具有相同列的行并打印特定列并添加到原始文件中?

这是我们拥有的文本文件:

文件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. 对文件进行排序 1

    sort file1.txt > file1.sorted.txt

  2. 从 file2 中取出有趣的部分(并对其进行排序)

    awk '{print $5,$1,$7}' file2.txt | sort > file2_of_interest.txt

  3. 根据键(两个文件中的第 1 列)连接两个输出

    join file1.sorted.txt file2_of_interest.txt -1 1 -2 1

您可以使用间接方式组合这三个步骤 - 但最终您需要完成至少一个文件的解析。还会有人担心 file2.txt 中的 L 列不唯一和/或 file1.txt 中的第 1 列不唯一 - 您需要通过放入业务逻辑以使键唯一来解决这些问题。

相关内容