【问题标题】:trying to add text at the end of a line at the fist occurrence of a variable in a file尝试在文件中第一次出现变量时在行尾添加文本
【发布时间】:2016-11-29 18:13:27
【问题描述】:

我在下面附上了我正在使用的文本文件: 使用 sed 我可以得到一个添加文本的结果,但它被添加到包含我的变量的每一行,在这种情况下恰好是“33”。我只想将文本“SLOTS”添加到文件中的第一个匹配项中,并且在遇到第一个匹配项时基本上停止。 sed 将文本“SLOTS”添加到我的文本文件中包含我的变量的每一行,还有其他列恰好与我的变量具有相同的值。我搜索了许多网站以获得所需的结果,但没有任何运气尝试 awk 或其他 sed 示例。任何帮助将不胜感激。

这是我当前的 sed 行: sed '/\b'$slot_drill'\b/s/$/SLOTS/' $slot_card > $new_slot_card

我当前的 sed 行输出:

d25104-1.dr -- 面板尺寸:18x24

钻孔:是

刀具刀具主轴进给达到最大位路径时间

大小速度命中率(最小值)

T01 126 1.0 1.0 58 1600 0.0 182.8 1.7
T02 250 1.0 1.0 9 1600 0.0 67.5 0.7
T03 12 1.0 1.0 3965 1600 2.5 514.4 4.6
T04 31 1.0 1.0 65 1600 0.0 62.0 0.6
T05 33 1.0 1.0 569 1600 0.4 46.6 0.4 插槽
T06 35 1.0 1.0 33 1600 0.0 45.3 0.4 插槽
T07 41 1.0 1.0 97 1600 0.1 79.6 0.7
T08 42 1.0 1.0 135 1600 0.1 104.6 0.9
T09 43 1.0 1.0 33 1600 0.0 53.0 0.5 插槽
T10 49.2 1.0 1.0 65 1600 0.0 44.2 0.4
T11 52 1.0 1.0 17 1600 0.0 40.7 0.4
T12 63.5 1.0 1.0 33 1600 0.0 55.6 0.5 插槽

T13 98 1.0 1.0 25 1600 0.0 52.0 0.5

总计 5104 3.2 1348.2 12.5

想要的输出:

d25104-1.dr -- 面板尺寸:18x24

钻孔:是

刀具刀具主轴进给达到最大位路径时间

大小速度命中率(最小值)

T01 126 1.0 1.0 58 1600 0.0 182.8 1.7
T02 250 1.0 1.0 9 1600 0.0 67.5 0.7
T03 12 1.0 1.0 3965 1600 2.5 514.4 4.6
T04 31 1.0 1.0 65 1600 0.0 62.0 0.6
T05 33 1.0 1.0 569 1600 0.4 46.6 0.4 插槽
T06 35 1.0 1.0 33 1600 0.0 45.3 0.4
T07 41 1.0 1.0 97 1600 0.1 79.6 0.7
T08 42 1.0 1.0 135 1600 0.1 104.6 0.9
T09 43 1.0 1.0 33 1600 0.0 53.0 0.5
T10 49.2 1.0 1.0 65 1600 0.0 44.2 0.4
T11 52 1.0 1.0 17 1600 0.0 40.7 0.4
T12 63.5 1.0 1.0 33 1600 0.0 55.6 0.5

T13 98 1.0 1.0 25 1600 0.0 52.0 0.5

总计 5104 3.2 1348.2 12.5

desired output

【问题讨论】:

  • 请使用纯文本,而不是使用图像来显示您的输出,因为它使您的问题更加清晰。 Edit 你的问题是向我们展示你当前和期望的输出,使用代码块(选择文本,然后 Ctrl-k)。
  • 谢谢汤姆,我尝试将文本粘贴到问题区域,但我丢失了所有格式。我会试试你的建议。

标签: awk sed


【解决方案1】:

很难说出你在问什么。一个好的最小示例可能会省略 shell 变量,并将您正在使用的行完全独立,以便其他人可以在他们自己的系统上运行它。

但是,听起来好像您只是在询问如何将seds 命令限制为仅适用于它发现匹配的第一行。一般来说,我认为方法是在命令前面加上一个范围,并使用0 作为范围的开头。例如:sed '0,/foo/ {s/foo/bar}' 将仅将找到的第一个 foo 实例替换为 bar。

这是在https://unix.stackexchange.com/questions/188264/want-to-substitute-only-first-occurence-with-sed给出的此类问题的答案

【讨论】:

  • 是的,我试图只替换它找到匹配项的第一行。我试过'0,它会将文本添加到匹配的每一行。我不确定它为什么会这样,也许是因为文件的第一行是空行?
【解决方案2】:

awk 来救援!

简化文件

$ cat file
1
2
3
1
2
3

将 SLOT 附加到变量 slot 的第一个匹配项,比如 3。

$ awk -v value="$slot" '$1==value && !c++{$0=$0 "SLOT"} 1' file

1
2
3SLOT
1
2
3

看看你的例子,你需要使用`$2==value`

【讨论】:

  • 谢谢 karakfa,我的变量将在某个列中,所以我将 /3/ 替换为 $2==$my_var 但我收到错误“s: event not found”
  • 您需要将变量传递给awk,请参阅我更新的示例。
  • 感谢您的帮助!我相信我现在走在正确的道路上。
猜你喜欢
  • 2014-10-19
  • 2013-11-25
  • 2023-02-07
  • 2014-11-19
  • 2022-08-15
  • 2021-01-27
  • 2023-01-12
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多