两个文件之间的AWK匹配字段

时间:2016-08-05 11:16:45

标签: linux bash awk

我是sh和AWK命令的新手,我一直在尝试使用不同选项但没有工作的命令:(

我有两个文件,我希望将file1中的位置22,3与file2上的字符串相匹配。如果没有匹配,我需要写file1行。

File1:

  

/批次/共享/ TZ / TMP / AAA
    /批次/共享/ TZ / TMP / BBB
    /批次/共享/ TZ / TMP / CCC
    /批次/共享/ TZ / TMP / DDD

File2:

  

BBB
    DDD

结果:

  

/批次/共享/ TZ / TMP / BBB
    /批次/共享/ TZ / TMP / DDD

我从来没有在这个页面上写过,但却多次保存我的屁股。 十分感谢!

4 个答案:

答案 0 :(得分:1)

看起来你正在寻找awk中的substr函数

$ awk 'NR==FNR{arry[substr($0,22,3)]=$0;next}$0 in arry{print arry[$0]}' file1 file2
/batch/shared/TZ/TMP/BBB
/batch/shared/TZ/TMP/DDD

应该做你想做的事。

但是有一个更简单的选项,使用/作为分隔符

awk -v FS="/" 'NR==FNR{arry[$NF]=$0;next}$0 in arry{print arry[$0]}' file1 file2

此处$NF将为第一个文件的每条记录提供最后一个字段。

答案 1 :(得分:1)

这正是您正在寻找的:

awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if(substr($0,22,3)~i) { n=1}  } } n' file2 file1

希望这有帮助:)

答案 2 :(得分:0)

下面:

$ awk '!(substr($0,22,3) in a){a[$0];next} 1' file2 file1
/batch/shared/TZ/TMP/BBB
/batch/shared/TZ/TMP/DDD

步行得来速:

!(substr($0,22,3) in a)  # first read file2 with partial strings of file1 (BBB)
{                        # there won't be match until substr returns something so
    a[$0]                # put it in a and
    next                 # process next
} 
1                        # when substr returns a positive match, print it

如果您确实需要与问题评论中讨论的相反的结果集:

$ awk 'NR>FNR && !(substr($0,22,3) in a) {print; next} {a[$0]}' file2 file1
/batch/shared/TZ/TMP/AAA
/batch/shared/TZ/TMP/CCC

答案 3 :(得分:0)

谢谢大家!

awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if(substr($0,22,3)~i) {
n=1}  } } n' file2 file1  

awk -F/ 'NR==FNR{a[$0];next}$NF in a' file2 file1

这两个结果适用于我在第一次评论时提出的问题。 我做错了,我需要的结果与我的结果相反:(

新结果:

  

/批次/共享/ TZ / TMP / BBB
  /批次/共享/ TZ / TMP / DDD

抱歉我的英文。

非常感谢!