Awk 删除文件中的每个事件

Awk 删除文件中的每个事件,awk,sed,Awk,Sed,假设我有一个包含以下格式内容的文件: 6 8 6 9 12 20 6 8 9 12 20 35 如果在下一行中找到编号(第1列或第2列),我想删除所有行,无论该编号是在第一列还是第2列中,包括找到初始编号的行 因此,我应该这样做: 35 我试过使用 awk '{for(i=1;i<=NF;i++){if($i in a){next};a[$i]}} 1' awk'{for(i=1;i您可以尝试以下方法: cat yourFile | tr ' ' '\n' | sort | un

假设我有一个包含以下格式内容的文件:

6 8
6 9
12 20
6
8
9
12
20
35
如果在下一行中找到编号(第1列或第2列),我想删除所有行,无论该编号是在第一列还是第2列中,包括找到初始编号的行

因此,我应该这样做:

35
我试过使用

awk '{for(i=1;i<=NF;i++){if($i in a){next};a[$i]}} 1' 

awk'{for(i=1;i您可以尝试以下方法:

cat yourFile | tr ' ' '\n' | sort  | uniq -u
这一行应该有助于:

awk 'NR==FNR{a[$0]++;next}{for(i=1;i<=NF;i++)if(a[$i]>1)next}7' 
     RS=" |\n" file RS="\n" file
上面的一个班轮将输出:

100 200 300
35

您最初编写的代码在以下条件下工作正常:当且仅当上一行中的任何一行在当前行中没有列出数字时,才打印当前行。但是,您不请求上一行,而请求下一行

最简单的解决方案是
tac
输入,然后
tac
返回

$ tac <file> | awk '{for(i=1;i<=NF;i++){if($i in a) next;a[$i]}}1' | tac
内存:

$ awk '(NR==FNR){ for(i=1;i<=NF;i++) a[$i]++; next }'
       { b=0; for(i=1;i<=NF;i++) b+=--a[$i] }
       !b; <file> <file>
$ awk '{ m[NR]=$0; for(i=1;i<=NF;i++) a[$i]++; next }
       END { for (n=1;n<=NR;++n) {
               b=0; $0=m[n];
               for(i=1;i<=NF;i++) b+=--a[$i]
               if (!b) { print }
             }
           }' <file>
awk '
{
    for(i=1;i<=NF;i++) {
        if($i in r) {             # just store the NR of last duplicate
            delete a[r[$i]]
            f=1
        }
        r[$i]=NR
    }
    if(f=="") 
        a[NR]=$0
    f=""
}
END {
    for(i=1;i<=NR;i++)
        if(i in a)
            print a[i]
}' file
35
如果要删除所有包含文件中出现的数字的行,只需执行以下操作:

$ awk '(NR==FNR) { for(i=1;i<=NF;i++) a[$i]++; next }
       { b=1; for(i=1;i<=NF;i++) b = b && (a[$i]==1) }
       b' <file> <file>

$awk'(NR==FNR){for(i=1;iawk中的另一个,处理数据一次:

awk ' 
{
    for(i=1;i<=NF;i++) {          # process numbers in record
        r[$i]=r[$i] NR OFS        # add NR on a record list array
        if(p=split(r[$i],t)>1) {  # if there are more than one record in r
            for(j in t)           # delete records on the list
                delete a[t[j]]
            f=1                   # flag up 
        }
    }
    if(f=="")                     # if flag is down
        a[NR]=$0                  # store current record 
    f=""                          # reset flag
}
END {
    for(i=1;i<=NR;i++)            # in the end
        if(i in a)                # print all records stored
            print a[i]
}' file
35
awk'
{
对于(i=1;i1){#如果r中有多个记录
对于(j in t)#删除列表中的记录
删除[t[j]]
f=1#向上标记
}
}
如果(f==“”)#如果标志已关闭
a[NR]=$0#存储当前记录
f=”“#重置标志
}
结束{

对于(i=1;i您希望查找只出现一次的数字。让我将“42”添加到与“35”相同的行中

要查找只出现一次的所有号码,请执行以下操作:

$ tr -s "[:blank:]" "\n" < file | sort -n | uniq -u
35
42
$tr-s“[:blank:][\n”
但这并没有显示文件中它们出现的行,所以

$ grep -n -Fw -f <(tr -s "[:blank:]" "\n" < file | sort -n | uniq -u) file
9:35  42

$grep-n-Fw-f请在“代码标签”中的帖子中添加您为解决此问题所做的任何努力。那么输出不应该是35和12吗?编辑:忘记添加12。@Inours,请始终尝试在您的帖子中为输入和输出添加正确的示例。还尝试通过对有用答案的投票来鼓励人们。展示您的努力如果我正确地解释了你的问题,那么我希望得到以下输出
6\n8\n9\n12\n20\n35
。这些数字都不会出现在下一行中。第4行包含数字6。正如你所说,这个数字直到最后才会出现在第5行中。下一行同上。
uniq-u
是您要查找的,但这并没有显示原始文件中的行。此外,您可以将sed简化为
sed-n的/^*1//p'
,其中只有在进行替换时才会打印行。感谢这些提示!对我来说,
uniq-u
确实打印了这些行?!
$ cat file
6 8
6 9
12 20
6
8
9
12
20
35  42
$ tr -s "[:blank:]" "\n" < file | sort -n | uniq -u
35
42
$ grep -n -Fw -f <(tr -s "[:blank:]" "\n" < file | sort -n | uniq -u) file
9:35  42