【问题标题】:using sed with variables in CSH在 CSH 中使用带有变量的 sed
【发布时间】:2018-10-21 06:05:35
【问题描述】:

希望这是有道理的。我的理想目标是读取一个文件并用另一个变量更改一个变量,但新变量每次都会递增。

例子:

输入文件-

SAK, 123, 345
SAK, 456, 789
SAK, 789, 901

我希望我的输出看起来像什么 -

1, 123, 345
2, 456, 789
3, 789, 901

如您所见,SAK 被替换为一个数字,但该数字每次都会递增。

我试过这样做:

#!/bin/csh -f
set filename=/export/home/develop/data/buy_load_file.dat

set line=1
set sak_num=1
set search=SAK

set totallines=`wc -l $filename | cut -f1 -d' '`

echo $totallines

while( $line <= $totallines )
`sed "$line s/$search/$sak_num/" $filename`
@ line++
@ sak_num++
end

但是 sed 命令对我永远不起作用。我尝试阅读不同的方法来做到这一点,但我认为我的问题是 $filename 无法正确读取它。我认为 awk 可能是另一个可能做我想做的事情的命令,但不确定如何做。

有什么想法吗?或者也许是一种更简单的方法来获得我想要的输出。 谢谢!

【问题讨论】:

  • C 是如何出现的?您是否打算编写 C 程序并将其编译为可执行文件?这样你的目标确实很容易实现……
  • 哎呀!不,我的意思是在 c shell 中
  • 不要编写 C shell 脚本。见google.com/search?q=csh+why+not

标签: shell variables awk sed increment


【解决方案1】:

如果您的输入样本具有代表性,因为搜索字符串在每条记录中恰好出现一次作为第一个字段:

$ awk '{print ++n ",", $2, $3}' file
1, 123, 345
2, 456, 789
3, 789, 901

编辑:用一个更通用的解决方案替换以前的版本)

更一般地,如果搜索字符串在给定记录中可能出现多次或根本不出现:

$ cat file2
SAK, abc, def,
ghi, jkl, mno
pqr, SAK, SAK
stu, vwx, yz
aaa, bbb, SAK


$ awk -v search=SAK '{for (i=1; i<=NF; ++i) if (sub(search, n+1, $i)) ++n}1' file2
1, abc, def,
ghi, jkl, mno
pqr, 2, 3
stu, vwx, yz
aaa, bbb, 4

【讨论】:

  • 我希望您提供的第二个示例能够正常工作,但我不断收到此错误:不能超过 3,000 字节。
  • 您的输入文件是否有超过 3000 字节的行?如果不是,则可能存在行尾问题,使 awk 将整个文件解释为单行。如果你确实有很长的行,也许你可以使用gawk,它不应该有行长限制。
  • 我会尝试 gawk,因为我的文件大于 3000 字节
  • 需要明确的是,3000 字节不是文件大小的限制,而是文件中各个行(记录)的大小。
猜你喜欢
  • 2010-10-20
  • 2011-10-25
  • 2012-12-24
  • 2017-02-27
  • 2022-10-07
  • 2019-11-05
  • 2016-07-29
  • 2016-05-11
  • 2013-03-12
相关资源
最近更新 更多