AWK在同一文件中的两列中查找公共数据

时间:2018-01-17 07:17:11

标签: awk

我正在使用下面的代码/命令在两个文件中查找公共数据,并在找到文件时发送输出。

awk 'FNR==NR{l[$0]=NR; next}; $0 in l{print $0, l[$0], FNR}' MF*.txt OF*.txt > F22.txt`enter code here`

但我需要你的帮助通过使用AWK,我需要在同一个文件中的两列中查找公共数据 例如,以下是包含数据的两列,需要搜索列 A 是否等于单词 CAN 然后,如果列 B 包含在 C 列中找到的某些值,则会将这些匹配项打印到单独的文件中行号和任何错误代码。

A       B           C
CAN     9876        45678
CAN     1234        93939
CAN     45678       9090
ABC     4567        8080
BCD     97654       9876
CAN     9090        8181

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

您可以使用以下awk命令:

awk 'NR>1{if($1=="CAN"){lines[$2]=NR" "$0;}C[$3]=$3}END{for(i in lines){if(C[i])print lines[i]}}' input_file.txt > output_file.out

识别符合问题所述条件的行:

  

如果列B等于单词CAN,则需要搜索   包含在C列中找到的一些值,然后打印   这些匹配到具有行号和任何错误代码的单独文件中。

输入您的输入数据:

7 CAN     9090        8181
2 CAN     9876        45678
4 CAN     45678       9090

<强>说明:

  • NR>1从第二行开始处理
  • if($1=="CAN"){lines[$2]=NR" "$0;}对于以CAN开头的每一行,您将行的行号存储在数组中,其中键/索引是第二列的值。
  • C[$3]=$3存储第3列的所有值
  • END{for(i in lines){if(C[i])print lines[i]}检查存储的所有行,如果第3列中存在的值等于第2列的值,如果是这样,则输出行号和相关行

    如果您要处理多个输入文件,则可以使用以下awk 命令:

    awk 'FNR>1{if($1=="CAN"){lines[$2]=FILENAME" "FNR" "$0;}C[$3]=$3}END{for(i in lines){if(C[i])print lines[i]}}' MF*.txt OF*.txt > output_file.out
    

,其中

  • FNR是每个文件中的相对位置
  • FILENAME是正在处理的当前文件的名称
  • 假设:如果不是您可以删除A B C
  • 的情况,则每个文件的第一行都是标题FNR>1

<强> TEST:

enter image description here