我是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
我从来没有在这个页面上写过,但却多次保存我的屁股。 十分感谢!
答案 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
抱歉我的英文。
非常感谢!