![删除两列前 4 个字符之间包含重复字符串的行](https://linux22.com/image/127579/%E5%88%A0%E9%99%A4%E4%B8%A4%E5%88%97%E5%89%8D%204%20%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E5%8C%85%E5%90%AB%E9%87%8D%E5%A4%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E8%A1%8C.png)
我有一个包含 4 列和 7,000 行的大文件。我需要删除第二列的开头与第四列的开头相同的行。
输入:
Gator_locus75 AATTCCATGTACG Gator_locus23 CTAGAGGAAGT
Gator_locus18 AATTCCATTATGG Gator_locus14 AATTCAAAAAAT
Gator_locus13 CTAGAACCCACC Gator_locus72 CTAGAATGTATG
Gator_locus16 AATTCATCCTCT Gator_locus15 CTAGATTGCCAA
Gator_locus24 CTAGAGCTGCTG Gator_locus12 AATTCAGTCCAC
输出:
Gator_locus75 AATTCCATGTACG Gator_locus23 CTAGAGGAAGT
Gator_locus16 AATTCATCCTCT Gator_locus15 CTAGATTGCCAA
Gator_locus24 CTAGAGCTGCTG Gator_locus12 AATTCAGTCCAC
我需要删除第二列中的字符串以“AATT”开头且同一行第四列中的字符串以“AATT”开头的行。当第二列中的字符串以“CTAG”开头且第四列中的字符串以“CTAG”开头时,我还需要执行相同的操作。
答案1
要打印第 2 列的前 4 个字符不等于第 4 列的前 4 个字符的行:
awk 'substr($2, 1, 4) != substr($4, 1, 4)' < input
这使用主代码作为“测试”来查看是否应该打印一行;没有明确的操作部分,因为默认打印操作就是我们想要的。主代码只是从每列中提取前四个字符并进行比较。
答案2
删除第二个字段开头的行AATT
和第四个字段以AATT
, 开头,与 相同CATG
:
awk '($2 !~ /^AATT/ && $4 !~ /^AATT/) && ($2 !~ /^CTAG/ && $4 !~ /^CTAG/) {print}' /path/to/file
作为更通用的解决方案:
awk 'substr($2,1,4) != substr($4,1,4) {print}' /path/to/file