我有两个txt文件(制表符分隔),我试图与awk比较。我想比较file1的第1列和file2的第5列,任何时候file1的第1列中的字符串与file2的第5列匹配,我想打印(最终打印到一个新的txt文件)file2的整行。文件1中有大约14000行,只有一列,文件2中有40000行,有6列。下面是一些测试文件,我一直在尝试弄清楚如何使用awk来获得我想要的输出。
file1
AAGAB
AAK1
AAMDC
AAMP
AAR2
AARD
AARS
file2
chr22 38035683 38052050 NM_018957 AAMDC +
chrX 47001614 47004609 NM_019056 AAMP -
chr9 21994789 22077889 NR_047539 AAR2 +
chr16 20370491 20416033 NM_174924 AARD -
chr1 210111518 210337633 NM_001146262 AARS +
chrX 30233674 30238206 NM_002364 MAGEB2 +
chrX 30261847 30270155 NM_002363 MAGEB1 +
我试着从SO上大量类似的awk问题中采用一些具有类似期望输出的其他awk问题:
awk -F '\t' 'NR==FNR{c[$1]++;next}c[$5]' file1 file2
但是我只得到阿尔斯行的一个匹配,尽管测试文件中还有其他匹配:
chr1 210111518 210337633 NM_001146262 AARS +
我正在寻找的输出是:
chr14 94463615 94473898 NR_024182 AAGAB +
chr10 74033676 74035797 NM_019058 AAK1 +
chr22 38035683 38052050 NM_018957 AAMDC +
chrX 47001614 47004609 NM_019056 AAMP -
chr9 21994789 22077889 NR_047539 AAR2 +
chr16 20370491 20416033 NM_174924 AARD -
chr1 210111518 210337633 NM_001146262 AARS +
我试过在stackoverflow上采用其他几个帖子,但即使存在多个其他帖子,也只能得到1个匹配的相同输出:
awk to match file1 with file2 and output matches
awk -F '\t' 'NR==FNR{c[$1]; next} ($5 in c)' file1 file2
Find rows with the same value in a column in two files
awk -F '\t' 'NR==FNR{A[$1];next}$5 in A' file1 file2
Comparing two columns in two files using awk
awk -F '\t' 'FNR==NR {a[$1];next} {for (i in a) if ($5~i) print}' file1 file2
有人能帮助我理解我的awk线路出错了吗?
我目前使用的是GNU Awk 4.2.1,API:2.0
5条答案
按热度按时间cotxawn71#
我觉得你差点就成功了...我做了检查--下面的工作对我来说。
结果(示例中的输出与file 2不一致):
可能是财政司司长出了问题,我想...您可以尝试让FS同时命中空格和制表符,并尝试从混乱中删除任何不可见和不可打印的字符?
2skhul332#
从
file1
读入关联数组。然后读取file2
,并为每一行查找匹配项。qxgroojn3#
我将您的示例内容复制到“file1”和“file2”中,并将以下内容写入“script.awk”
运行
结果是
在我的理解中,这是正确的。请检查一下。
gstyhher4#
检查您的文件是否有您期望的文件夹。
我复制/粘贴您的数据,并获得成功,
但没有一个
我打开文件,用制表符替换所有连续的空格,然后再次运行它,两者都是一样的。
有时候,太多的细节会适得其反。
t98cgbkg5#
如果您的文件可能不是以制表符分隔的,那么您可以使用
sed
将空格和制表符替换为单个制表符。这假设数据中没有空格:一旦你有了这个命令,你可以使用Unix
join
命令:需要在连接字段中对文件进行排序。如果已按该字段排序,则不需要排序。
或者,这个awk工作:
Join的优点是可以处理比内存大的文件。awk不需要排序,如果你有足够的内存,它可能会更快。
或者(使用您的两个输入示例)打印: