다음 값을 가진 파일이 있습니다.
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 문을 단순화하고 불필요한 줄을 제거했습니다.