Awk 打印具有多个分隔符的类似列的行
我有两个文件: file1.txtAwk 打印具有多个分隔符的类似列的行,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中的行。这是我
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