我有一个文件,其值如下:
location 100 SlotNumber
..some lines inbetween
location 150 SlotNumber
..some lines inbetween
location 160 SlotNumber
..some lines inbetween
我想像 SlotNumber 一样替换 SlotNumber:
location 100 SlotNumber1
location 150 SlotNumber2
location 160 SlotNumber3
...
请注意,100 和 1 没有任何相关性。我希望在 sed 中使用某种计数器,并将 SlotNumber 替换为“SlotNumber+Counter”,并在每次匹配后递增它。
我不知道该文件中有多少次出现。
答案1
从这里的基本文件开始......
$ cat file
location 100 Number
location 101 Number
location 102 Number
我们可以匹配所有行:
$ awk '{print $0 NR}' file
location 100 Number1
location 101 Number2
location 102 Number3
如果中间有填充物,事情会变得更加复杂。您必须有一个单独的计数器来统计您看到某个位置的次数。
$ cat file
location 100 SlotNumber
..some lines inbetween
location 150 SlotNumber
..some lines inbetween
location 160 SlotNumber
..some lines inbetween
我们只能打印位置线:
$ awk 'BEGIN {x=1} /^location/ {print $0 x++}' file
location 100 SlotNumber1
location 150 SlotNumber2
location 160 SlotNumber3
或者全部,仅添加插槽编号的数字。
$ awk 'BEGIN {x=1} {if ($3=="SlotNumber") {print $0 x++} else {print $0} }' file
location 100 SlotNumber1
..some lines inbetween
location 150 SlotNumber2
..some lines inbetween
location 160 SlotNumber3
..some lines inbetween
这是一个很好的网站,提供了 awk 的一些基本 if-then-else 解释。
http://www.thegeekstuff.com/2010/02/awk-conditional-statements/
答案2
如果您想要替代行号,以防万一您的文件混淆了这样的数字
location 100 Number
location 101 Number
location 102 Number
location 104 Number
location 103 Number
..
..
location 199 Number
location 200 Number
你可以尝试这样的事情。假设数字从 100 开始。
while read line
do
num=`echo $line | cut -f2 -d ' '`
val=`expr $num - 100`
echo "$line$val"
done < ln.txt
这打印出来
location 100 Number0
location 101 Number1
location 102 Number2
location 104 Number4
location 103 Number3
..
location 199 Number99
location 200 Number100
编辑:感谢@Scott,简化了 echo 语句并删除了不必要的行。