AWK /…로 라인 시작 교체를 위해 라인 카운터를 늘리는 방법?


9

나는 먼저 SED ( sed "s/^/COUNTER \&/" /tmp/1.tex) 에 대해 생각 했지만 한 줄로 설계 되었으며 통합 된 접근 방식에 대한 awk훌륭한 경험이 있기 때문에 sed로 카운터 자체를 늘릴 수는 없습니다 gawk. 데이터

What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline

예상 출력

1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

운영체제 : Debian 8.5

답변:


11

nl 파일의 줄 번호를 매기는 유틸리티입니다.

nl /path/to/file

특정한 경우 :

$ nl  -s ' & ' input.txt                                                                                                 
     1 & What & South Dragon & North Dragon    & 5 \\ \hline
     2 & What & South Dragon & North Dragon    & 5 \\ \hline
     3 & What & South Dragon & North Dragon    & 5 \\ \hline

사전 카운터 및 앰퍼샌드와 어떻게 결합 할 수 있습니까? -카운터에서 작동하지만 후자에서도 확실하지 않습니다.
Léo Léopold Hertz 준영

3
nl -s ' &' /path/to/file. -s입력 파일의 본문에서 숫자를 구분하는 것을 지정합니다.
DopeGhoti

1
nl기본적으로 빈 줄에 번호를 cat -nawk
매기 지

10

이것은 당신이 추구하는 것을 달성합니다. ( awk '$0=NR" & "$0' filename그렇지만 약간 암호입니다)

awk '{print NR,"&",$0}' filename
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

또는 원하는 경우 sed동일한 결과를 제공합니다.

sed = filename | sed 'N;s/\n/ \& /'

perl 구혼.

perl -pe '$_="$. & $_"' filename
perl -pe 's/^/$. & /' filename

이 구문을 sed = filename | ...어떻게 찾았 습니까? --당신은 equal기호로 sed를 사용할 수 있다는 것을 몰랐습니다 . --당신의 sed진술은 역동적 인 환경에서 작동 할 수 있습니까 ? 어떤 약점?
Léo Léopold Hertz 준영

1
@ LéoLéopoldHertz 준영 맨 페이지 아래를 보았습니다. =운영자는 "제로 또는 한 주소 명령"섹션에 있습니다.
Sergiy Kolodyazhnyy

= Print the current line number. 따라서이 기능은 실제로 sed에 내장되어 있습니다. 좋은!
Léo Léopold Hertz 준영

3

파이썬은 이것을위한 좋은 대안 도구가 될 수 있습니다 :

$ python -c "import sys;lines=[str(i)+' & '+l for i,l in enumerate(sys.stdin,1)]; print ''.join(lines)" < input.txt      
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

이것이 작동하는 방식은 텍스트를 파이썬의 stdin으로 리디렉션하고 거기에서 줄을 읽는 것입니다. enumerate()function은 sys.stdin입력 으로 지정된 행 수를 제공 1하는 것으로 시작 색인입니다. 나머지는 간단합니다. 인덱스를 문자열과 함께 ' & '문자열로 묶어 줄로 새 문자열 목록을 작성 합니다. 마지막으로, ''.join()함수에 의해 목록에서 하나의 테스트로 재 조립됩니다 .

또는 스크립트 파일 또는 가독성을위한 여러 줄 버전이 있습니다.

#!/usr/bin/env python
import sys

for index,line in enumerate(sys.stdin,1):
    print str(index) + ' & ' + line.strip()

동일하게 작동합니다.

$ ./line_counter.py  < input.txt                                                                                         
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

그러나 bash에서 선호하는 경우 다음과 같이 수행 할 수 있습니다.

$ counter=1; while read line ; do printf "%s & %s\n" "$counter" "$line" ; counter=$(($counter+1)) ; done < input.txt
1 & What & South Dragon & North Dragon    & 5 \ hline
2 & What & South Dragon & North Dragon    & 5 \ hline
3 & What & South Dragon & North Dragon    & 5 \ hline

1
@ LéoLéopoldHertz 준영 글쎄, 열거하지 않고 그렇게하려면 줄 수를 추적하는 변수가 필요하며 해당 변수를 시작하고 매번 증가시켜야합니다. 를 사용 enumerate()하면 3 줄의 코드가 절약됩니다. 목록의 항목 처리와 같은 다른 작업을 처리 할 때 유용합니다. docs.python.org/2/library/functions.html#enumerate
Sergiy Kolodyazhnyy 2018

@ LéoLéopoldHertz 준영 bash예를 들어 카운터를 사용하는 것을 이해한다면 자유롭게 사용하십시오 :) 나는 경험 enumerate()에서보다 우아 하다는 것을 알았습니다 . 더 분명하다고 생각되면 다른 방법을 사용하십시오
Sergiy Kolodyazhnyy

OK, enumerate변수 인스턴스화보다 명확합니다. 람다식이 공간을 절약 할 수 있습니까?
Léo Léopold Hertz 준영

@ LéoLéopoldHertz 준영 긴 스크립트로 공간을 절약 할 수는 있지만,이 경우 어떻게 도움이 될지 모르겠습니다.
Sergiy Kolodyazhnyy

2

cat -n자동 번호 매기기와 함께 사용하는 옵션이기도합니다 .

while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.