awk - 在文件名中与模式匹配的特定位置插入文本

标签 awk sed grep xargs

我正在 Mac 上编辑一个名为“test.txt”的大型文本文件。大多数行以 # 开头,但有些行是制表符分隔的字段列表:

val1    val2    val3    val4    val5    val6    val7    val8    val9

我想做的是找到 val2 = fooval3 = bar 的特定行(或者只是 grep 查找字符串 foo\t bar,然后仅在这些行上,将 val9 替换为字符串 val9=val9。因此,如果 val9 'g1.t1',我会将其替换为 'g1.t1=g1.t1'

我能够想出以下命令:

fgrep -l -w 'foo    bar' test.txt | xargs sed -i "" 's/\([^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\)\t\([^\t]*\)/\1\t\2=\2/'

找到这些行,并进行这些修改,但这只是打印出这些修改后的行。

我想将整个文件写回一个名为“test_edited.txt”的新文件,仅进行这些更改。我觉得我提出的解决方案(依靠将 fgrep 的输出通过管道传输到 sed)不允许这样做。但也许我错过了一些东西?

欢迎任何建议!

谢谢!

最佳答案

awk 比带有看起来非常笨拙的正则表达式的 grep + xargs + sed` 更适合这项工作:

awk 'BEGIN{FS=OFS="\t"}
     $2 == "foo" && $3 == "bar" {$9 = $9 "=" $9} 1' file

# if you want to save changes back to original file use:
awk 'BEGIN{FS=OFS="\t"}
$2 == "foo" && $3 == "bar" {$9 = $9 "=" $9} 1' file > _tmp &&
mv _tmp file

关于awk - 在文件名中与模式匹配的特定位置插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75186286/

相关文章:

awk - Bash(awk) - 从数字行中获取平均值

awk - 使用 %d 在 Awk 程序中给出奇怪的舍入值

loops - Tcl foreach 循环中的 awk 命令

regex - sed 尝试在搜索和替换中使用捕获组时前面的正则表达式无效

linux - 如何删除字符串开始前和结束后的空格

bash - 打印同一行两个字符串之间的文本

tcp - 使用一系列 TCP 端口计算连接数的脚本

bash - 在 awk 脚本的 BEGIN 部​​分中确定 NR

shell - openshift 命令以编程方式/脚本捕获 POD 名称

bash - 使用 sed/awk/grep 更改配置变量或添加它(如果它不存在)