我正在尝试使用awk在特定字段上模仿uniq -d
来打印当前正在读取的行以及使用here中的第一种解决方案来打印前一行,但是它似乎打印出了同一行两次。
这是文件中内容的示例。
130 chr1 7237 7238 0k9imgkt
135 chr1 7637 7637 b9gko
138 chr1 7908 7908 kob9g
139 chr1 8045 8045 34e5rg 4r
151 chr1 8329 8329 b
151 chr1 8346 8346 345y46htyh
151 chr1 8346 8346 76jtuj
152 chr1 8358 8358 asfge
这是我使用的那行。我正在尝试根据第二,第三和第四字段比较行;如果两个或更多行在这些字段中相同,则打印这些行的全部。同样,可以安全地假设行是根据字段1、2和3进行排序的。
awk '{prev = $0; ++array[$2$3$4]; if(array[$2$3$4] == 2) {print; curr = $0; $0 = prev; print; $0 = curr}}' file
这就是我想要的输出。
151 chr1 8346 8346 345y46htyh
151 chr1 8346 8346 76jtuj
这就是输出。
151 chr1 8346 8346 76jtuj
151 chr1 8346 8346 76jtuj
答案 0 :(得分:1)
您正在打印同一行两次。尚不清楚您希望逻辑是什么,但是肯定print
语句之一应该是print curr
或也许是print prev
。 孤独的 prev
也不做任何事情,看起来好像是由于编辑错误而遗留下来的。
也许您正在寻找类似的东西
awk '++array[$2$3$4] >= 2 {
if(prev)print prev;
print;
prev = ""; next }
{ prev = $0 }' file
如果这不能满足您的要求,则可以编辑问题以更详细地描述您希望当前脚本应执行的操作;不执行所需操作的代码并不是传达所需操作的好方法。
答案 1 :(得分:1)
如果我正确理解了您的问题,请您试一试。
awk 'FNR==NR{a[$2$3$4]++;next} a[($2$3$4)]>1' Input_file Input_file
OR
awk '{k=$2 FS $3 FS $4} FNR==NR{a[k]++;next} a[k]>1' Input_file Input_file
输出如下。
151 chr1 8346 8346 345y46htyh
151 chr1 8346 8346 76jtuj
答案 2 :(得分:1)
这是另一个awk解决方案,它不会两次读取输入文件,即使您的输入未排序也可以正常工作。
awk '(k = $2 FS $3 FS $4) in a {
print a[k] $0; a[k] = ""; next
} { a[k] = $0 ORS }' file