Shell 在CSH中使用带变量的sed

Shell 在CSH中使用带变量的sed,shell,variables,awk,sed,increment,Shell,Variables,Awk,Sed,Increment,希望这是有道理的。我的理想目标是读取一个文件并用另一个变量更改一个变量,但新变量每次都递增 例如: 输入文件- 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

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

例如:

输入文件-

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
#/垃圾箱/垃圾箱-f
设置文件名=/export/home/develop/data/buy\u load\u file.dat
设置行=1
设置sak_num=1
设置搜索=SAK
set totalines=`wc-l$filename | cut-f1-d''`
echo$Totalines

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

$ 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
$cat文件2
萨克,abc,def,
ghi,jkl,mno
pqr,萨克,萨克
斯图,vwx,yz
aaa,bbb,萨克

$awk-v search=SAK'{for(i=1;i C是如何做到这一点的?您是否计划编写一个C程序并将其编译成可执行文件?这样您的目标确实很容易实现…哦!不,我的意思是在C外壳中不要编写C外壳脚本。请看,我希望您提供的第二个示例可以工作,但我一直遇到这样的错误:不能超过3000字节。您认为呢r输入文件有超过3000字节的行?如果没有,可能会出现行尾问题,使awk将整个文件解释为一行。如果您有长行,也许可以使用
gawk
,它不应该有行长限制。我将尝试gawk,因为我的文件大于3000字节。为了清楚起见,3000字节字节不是对文件大小的限制,而是对文件中单个行(记录)的大小的限制。