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