尝试在awk中打​​印前一行,但似乎打印了当前行两次

时间:2019-04-05 14:32:28

标签: awk

我正在尝试使用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

3 个答案:

答案 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