【问题标题】:changing a certain value in a specific location in a text file under linux, done for multiple files在linux下更改文本文件中特定位置的某个值,对多个文件完成
【发布时间】:2014-08-19 17:42:17
【问题描述】:

我有近 500 个文本文件,每个文件包含 5 列数字和近 100 行,例如,我想将所有 10 更改为 15,但仅在第一列中。这可以使用 sed 完成吗?还是awk?我还想一次对所有 500 个文件执行此操作。

样本输入(简化)

10  10  19  
21  15  18 
10  25  10

想要的输出

15  10  19
21  15  18
15  25  10

【问题讨论】:

  • 如果你自己还没有尝试过任何东西(你应该),至少一些示例输入和所需的输出会很有用。
  • 我已经编辑了问题
  • 一个文件夹中的所有文件还是分散在多个子文件夹中?
  • 马库斯。在一个文件夹中。谢谢

标签: linux awk sed


【解决方案1】:

开始 的每一行替换为 10 ... 正则表达式字符 ^ 在行首匹配。

如果您的文本文件都在目录“yourdir”的子树中,您可以找到所有这些文件并对它们运行 sed:

find youdir -name \*.txt -exec sed -i '' -e 's/^10 /15 /' {} +

或者更简单地说,如果您的所有文本文件都在当前目录中:

sed -i '' -e 's/^10 /15 /' *.txt

这些说在行的开头用一个五空格替换一个零空格。

-i '' 选项表示无需备份就地修改文件。

【讨论】:

  • 这仅适用于第一列吗?请记住,所有 500 个文件的一零空格的位置都不相同?谢谢
  • @nytrook - 您的样本输入中并没有真正的“列”,您只是有以空格分隔的数字行。我展示的sed 替换仅在第一个数字作为一行中的第一个字符开始时才有效。如果您有前导空格或数字前面的内容,这将不起作用,您应该在示例输入中显示它。
  • 也许您的“样本输入(简化)”过于简化了。
  • 感谢您的解释。现在我知道了。效果很好。
【解决方案2】:

给定这个输入文件:

$ cat file
10 10 19
21 15 18
10 25 10

一般来说,将oldrowcol 列中的数字new 更改为:

$ awk -v old=10 -v new=37 -v row=1 -v col=1 'NR==row && $col==old{$col=new} 1' file
37 10 19
21 15 18
10 25 10

在所有行的col 列中:

$ awk -v old=10 -v new=37 -v col=1 '$col==old{$col=new} 1' file
37 10 19
21 15 18
37 25 10

在所有列的row 行中:

$ awk -v old=10 -v new=37 -v row=1 'NR==row{ for(col=i;col<=NF;col++) $col=($col==old?new:$col)} 1' file
37 37 19
21 15 18
10 25 10

你看到了模式...

【讨论】:

  • 艾德莫顿:是的。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多