根据上一个命令中的变量,使用 awk 或 sed 从文件中删除行

根据上一个命令中的变量,使用 awk 或 sed 从文件中删除行

我有一个包含字符串和数字的 CSV 文件(例如 temp.csv)。我需要删除文件中行开头包含特定字符串模式的行。例如,这是我的文件 -

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

我正在req_file_curr命令中 写入一个模式~ $ req_file_curr=req1

echo "${req_file_curr}"给出输出为req1

然而,当在一个sed命令,如下所示:

sed '/\"${req_file_curr}\"/d' temp.csv

给出输出为

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

我期望输出为

req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

如何使用 shell 中的变量作为模式来查找sed或者awk

答案1

您需要将sed模式用双引号引起来,以便 shell 可以在将变量传递给之前展开变量sed

sed "/^${req_file}/d" temp.csv

您还需要使用^锚点来指示sed此模式需要出现在行的开头。

答案2

不需要awksed这里:

grep -v "^$req_file_curr," file

请注意(如 forsedawk虽然在较小程度上),假设$req_file_curr不包含正则表达式运算符(如., *...)。

如果确实如此,您必须转义这些字符,或者使用awk,您可以使用使用其index()功能的方法:

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file

答案3

您已设置req_file_curr但使用req_file.并且您的sed命令将不起作用,因为 shell 变量无法在您的sed命令中扩展。

你可以试试这个:

$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

或使用sed双引号:

sed "/${req_file_curr}/d" file

并使用awk

$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

答案4

ed 解决方案就像这样。

  req_file_curr=req1

  printf '%s\n' "g/^$req_file_curr/d"  w | ed -s temp.csv

它会就地编辑文件,因此在针对您的文件运行此操作之前请先进行测试。

相关内容