AWK 替换大文件中以开头的行

AWK 替换大文件中以开头的行

我想$cont使用替换文件中以变量内容开头的行awk

5473  12G Ju 2 06:32 part3
5423  11G Ju 6 07:32 part4
573  11G Ju 2 08:21 part5
5473  11G Ju 6 09:12 part6
5423  1G Jl 6 09:32 part7

sed现在正在使用,但花了太多时间来做同样的事情。

sed代码如下。

现在我将找到并删除以 开头的行$cont并将其写入$cont文件。

cont="foo"
 newLineCont ="this is new line"
    parallel -a test.txt -k --block 30M --pipe-part "sed -i /^$cont/d" test.txt
      echo $newLineCont >> test.txt

想要使用 AWK 搜索文件中以变量 $cont 的内容开头的行并将其替换为 $newLineCont 的内容

答案1

$newLineCont如果第一个空格分隔字段等于 ,则将每一整行替换为$cont

awk -v c="$cont" -v nc="$newLineCont" '$1 == c { $0 = nc } 1' <infile >outfile

这将读取infile并创建一个名为 的新文件outfile。如果一行的第一个字段等于$cont,则整行将被替换为$newLinecont

尾随1是一种简短的书写方式{ print },将导致所有行被输出。


服用史蒂芬·查泽拉斯 (Stéphane Chazelas) 评论如下考虑到(如果一个或两个变量包含反斜杠):

env c="$cont" nc="$newLineCont" awk '$1 == ENVIRON["c"] { $0 = ENVIRON["nc"] } 1' <infile >outfile

使用sed

sed "s/^$cont[^0-9].*/$newLineCont/" <infile >outfile

使用 时sed,我们必须更加小心地在没有正则表达式的情况下匹配正确的内容。如果$cont12,我们做不是想要匹配以 . 开头的行123。这就是为什么我在$contwith之后显式匹配非数字[^0-9](我假设$cont是一个数字)。

与该awk命令一样,它读取infile并写入outfile.

如果$cont$newLineCont包含斜杠,则必须将它们转义为\/,并且如果$cont包含正则表达式中的任何其他特殊字符,则也需要正确转义它们。

相关内容