Awk 打印具有多个分隔符的类似列的行

Awk 打印具有多个分隔符的类似列的行,awk,text-processing,Awk,Text Processing,我有两个文件: file1.txt dn_id101_400_CT_TC string1 dn_id111_60_TT_AA string2 file2.txt dn_id101_400_XX_XX diffstring1 dn_id400_40_XY_YX diffstring2 dn_id111_60_GG_CC diffstring3 如果file2.txt中的行中存在由file1.txt中的\uu分隔的前三个元素,我想打印file2.txt中的行。这是我

我有两个文件:

file1.txt

dn_id101_400_CT_TC    string1
dn_id111_60_TT_AA    string2
file2.txt

dn_id101_400_XX_XX    diffstring1
dn_id400_40_XY_YX    diffstring2
dn_id111_60_GG_CC    diffstring3
如果file2.txt中的行中存在由file1.txt中的
\uu
分隔的前三个元素,我想打印file2.txt中的行。这是我想要的输出:

dn_id101_400_XX_XX    diffstring1
dn_id111_60_GG_CC    diffstring3
有办法做到这一点吗?可能通过更改
awk
的分隔符?我不知道如何在
awk
命令中处理多个分隔符。下面是我想使用的示例:

awk -F"\t" 'FNR==NR {a[$1]; next}; $1 in a' file1.txt file2.txt
你可以做:

$ awk -F"\t" '     
            {s=$1; sub(/_[[:upper:]]+_[[:upper:]]+$/, "", s)} 
    FNR==NR { arr[s]++} 
    FNR<NR && (s in arr)' f1 f2
dn_id101_400_XX_XX  diffstring1
dn_id111_60_GG_CC   diffstring3

我的方法是从file1中提取您想要的“key”值

awk -F_ '
        NR==FNR{str="^"$1"_"$2"_"$3; arr[str]=str}
        NR!=FNR{for (x in arr){if ($0 ~ x) {print  $0 ; next }}}
        #END{for(x in arr) print "arr["x"]="arr[x]}
        ' f1.txt f2.txt
输出

dn_id101_400_XX_XX    diffstring1
dn_id111_60_GG_CC    diffstring3
这会将文件1中的前3个
分隔值重新构造为
$1“\u2”\u3
。 删除
#
注释字符以查看
arr[]
中存储了哪些值

NR==FNR
NR=FNR
控制将哪个文件读入
arr[]
并处理哪个文件以匹配
($0~str)


IHTH

替代解决方案,具有
剪切
粘贴
加入
排序
和功能定义,以复制
awk
功能

$ f() { paste <(cut -d_ -f1-3 ${1}) ${1} | sort; }; \
  join -o2.2,2.3 <(f file1) <(f file2)    

dn_id101_400_XX_XX diffstring1
dn_id111_60_GG_CC diffstring3
$f(){paste您只需要:

$ awk -F_ '{k=$1 FS $2 FS $3} NR==FNR{a[k];next} k in a' file1 file2
dn_id101_400_XX_XX    diffstring1
dn_id111_60_GG_CC    diffstring3

您可能希望将正则表达式匹配锚定到字符串的开头,并在速度有问题的情况下打破循环。@shawnt00:是的,谢谢您的好主意。更新了我的答案,尽管EdM在“chars reduction department!”中击败了我!-)祝大家好运。谢谢@dawg!我能够轻松编辑第二个解决方案以适合我的具体位置这可能会很好。但是,在让我的
加入
正常工作方面,我遇到了一些严重的问题。谢谢你的建议!:)什么不起作用?除了输出格式之外,
加入
中没有隐藏的魔法,使用默认键。
$ awk -F_ '{k=$1 FS $2 FS $3} NR==FNR{a[k];next} k in a' file1 file2
dn_id101_400_XX_XX    diffstring1
dn_id111_60_GG_CC    diffstring3