tit*_*ule 1 sed awk text-processing
我想删除data.txt
包含keys.txt
文件中第二列参数之一的每一行。
keys.txt
2 aa
2 bb
2 cc
2 dd
Run Code Online (Sandbox Code Playgroud)
data.txt
1 aa It is great
1 aa I want to delete this line
1 kk Really ?
1 bb Yes, I think so.
1 bb Why ?
1 kk Because I don't like the current situation
1 ll I want to change
1 cc Indeed it's a need
1 cc Sorry
1 zz Ok !
Run Code Online (Sandbox Code Playgroud)
1 kk Really ?
1 kk Because I don't like the current situation
1 ll I want to change
1 zz Ok !
Run Code Online (Sandbox Code Playgroud)
我尝试了以下awk
程序:
awk '
NR == FNR {pattern[$0]; next}
{
for (var in pattern) {
if ($0 ~ var) {
getline
next
}
}
print >> GoodFile.txt
}
' keys.txt
Run Code Online (Sandbox Code Playgroud)
你已经很接近了,只是缺少一些小点:
data.txt
作为参数添加到您的awk
调用中,否则将不会处理该文件。keys.txt
到您的删除数据库中,因此您应该将其限制为第二个字段($2
而不是$0
)。if ($0 ~ var)
检查是否data.txt
应排除一行。在这里,您也应该只比较该行的第二个字段,并且应该使用精确匹配 ( ==
) 而不是正则表达式匹配来防止您的键可能包含正则表达式特有的字符的情况。awk
,你实际上不需要。您可以改为重定向输出。因此,稍作修改:
awk 'NR==FNR{pattern[$2];next} !($2 in pattern)' keys.txt data.txt > GoodFile.txt
Run Code Online (Sandbox Code Playgroud)
这将注册keys.txt
array中每一行的第二列pattern
,但对该文件不做任何其他事情。对于data.txt
,它将到达!($2 in pattern)
为每行评估条件的点。如果条件评估为“真”(即该行的第二列不在数组的索引中pattern
),则将打印当前行。
脚本中的第一个问题是:
NR == FNR {pattern[$0]; next}
Run Code Online (Sandbox Code Playgroud)
您将整行用作pattern
数组的键,但您只需要第二个字段。你不需要next
and getline
,你想要的只是next
移动到下一行。您还忘记将第二个文件作为输入传递。最后,您需要引用文件名,因为它只是一个字符串,而不是一个变量。修复这两个错误会产生:
awk '
NR == FNR {pattern[$2]; next}
{
for (var in pattern) {
if ($0 ~ var) {
getline
next
}
}
print >> "GoodFile.txt"
}
' keys.txt data.txt
Run Code Online (Sandbox Code Playgroud)
现在,你确定你想去>>
那里吗?这意味着awk
不会覆盖文件中已有的任何内容(例如,上次运行的输出)。>>
如果您只是不想awk
在一次运行中覆盖自己的输出,>
则不需要,就足够了。仅>>
当您想保留以前运行的数据时才需要,我怀疑您不需要。
此外,根据您的数据,您实际上并不想检查整行。您只想跳过data.txt
第二个字段与keys.txt
. 如果是这样,这将更有效率,尤其是对于较大的文件:
awk '
NR == FNR {pattern[$2]; next}
{
if ($2 in pattern) {
next
}
print > "GoodFile.txt"
}
' keys.txt data.txt
Run Code Online (Sandbox Code Playgroud)
或者,等效但更简洁:
awk '
NR == FNR {pattern[$2]; next}
{
if (!($2 in pattern) {
print > "GoodFile.txt"
}
}
' keys.txt data.txt
Run Code Online (Sandbox Code Playgroud)