[linux] awk를 사용하여 n에서 마지막까지 모든 열을 인쇄

이 줄은 두 번째 필드에 공백이 생길 때까지 작동했습니다.

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

awk를 $ 2 이상으로 인쇄하는 방법이 있습니까? (더 이상 열이 없어 질 때까지 $ 3, $ 4 ..?)

Cygwin이있는 Windows 환경 에서이 작업을 수행한다고 추가해야한다고 가정합니다.



답변

첫 번째 열을 제외한 모든 열을 인쇄합니다.

awk '{$1=""; print $0}' somefile

두 개의 첫 번째 열을 제외한 모든 열을 인쇄합니다.

awk '{$1=$2=""; print $0}' somefile


답변

cut을 사용하여 더 간단한 답변 을 가진 중복 질문이 있습니다 .

 svn status |  grep '\!' | cut -d\  -f2-

-ddelimeter (space)-f지정하고 열 목록을 지정합니다 (모두 2로 시작)


답변

for-loop를 사용하여 $ 2에서 $ NF까지의 인쇄 필드 (라인의 필드 수를 나타내는 내장 변수)를 반복 할 수 있습니다.

편집 : “print”는 개행을 추가하므로 결과를 버퍼링해야합니다.

awk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'

또는 printf를 사용하십시오 :

awk '{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}'


답변

awk '{out=$2; for(i=3;i<=NF;i++){out=out" "$i}; print out}'

내 대답은 VeeArr 중 하나를 기반으로 하지만 두 번째 열 (및 나머지)을 인쇄하기 전에 공백으로 시작한 것을 알았습니다. 평판 포인트가 하나뿐이므로 댓글을 달 수 없으므로 여기에 새로운 답변이됩니다.

두 번째 열로 “out”으로 시작한 다음 다른 열을 모두 추가하십시오 (있는 경우). 두 번째 열이있는 한 잘 진행됩니다.


답변

awk가있는 대부분의 솔루션은 공백을 남깁니다. 여기서 옵션은 그 문제를 피합니다.

옵션 1

간단한 절단 솔루션 (단일 구분 기호로만 작동) :

command | cut -d' ' -f3-

옵션 2

awk를 다시 계산하면 첫 번째 필드를 제거하여 남은 선행 공간 (OFS)을 제거 할 수 있습니다 (일부 awk 버전에서 작동).

command | awk '{ $1=$2="";$0=$0;} NF=NF'

옵션 3

로 서식이 지정된 각 필드를 인쇄 printf하면 더 많은 제어가 가능합니다.

$ in='    1    2  3     4   5   6 7     8  '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8

그러나 모든 이전 답변은 필드 사이의 모든 반복 FS를 OFS로 변경합니다. 그렇게하지 않는 몇 가지 옵션을 만들어 봅시다.

옵션 4 (권장)

앞의 필드와 구분자를 제거하기위한 sub가있는 루프.
그리고 공간 대신 ​​FS 값을 사용하십시오 (변경 가능).
휴대 성, 그리고 OFS에 FS의 변화를 트리거하지 않습니다
참고 : (가) ^[FS]*선행 공백이있는 입력을 허용하는 것입니다.

$ in='    1    2  3     4   5   6 7     8  '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
  for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3     4   5   6 7     8

옵션 5

다음과 같이 여분의 공백을 추가하지 않는 솔루션을 빌드하고 gensubGNU awk 의 기능 을 사용하여 기존 공백을 보존하는 것이 가능합니다.

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
          { print(gensub(a""b""c,"",1)); }'
3     4   5   6 7     8 

카운트가 지정된 필드 그룹을 바꾸는 데 사용될 수도 있습니다 n.

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
          {
            d=gensub(a""b""c,"",1);
            e=gensub("^(.*)"d,"\\1",1,$0);
            print("|"d"|","!"e"!");
          }'
|3     4   5   6 7     8  | !    1    2  !

물론 이러한 경우 OFS는 라인의 두 부분을 분리하는 데 사용되며 필드의 후행 공백은 여전히 ​​인쇄됩니다.

참고 : [FS]* 입력 라인에 선행 공백을 허용하는 데 사용됩니다.


답변

나는 개인적으로 위에서 언급 한 모든 답변을 시도했지만 대부분은 약간 복잡하거나 잘못되었습니다. 내 관점에서 가장 쉬운 방법은 다음과 같습니다.

awk -F" " '{ for (i=4; i<=NF; i++) print $i }'
  1. 여기서 -F “”는 awk가 사용할 구분자를 정의합니다. 필자의 경우 공백은 awk의 기본 구분 기호입니다. 이것은 -F “”를 무시할 수 있음을 의미합니다.

  2. 여기서 NF는 총 필드 / 컬럼 수를 정의합니다. 따라서 루프는 4 번째 필드부터 마지막 ​​필드 / 열까지 시작합니다.

  3. 여기서 $ N은 N 번째 필드의 값을 검색합니다. 따라서 print $ i는 루프 카운트에 따라 현재 필드 / 열을 인쇄합니다.


답변

awk '{ for(i=3; i<=NF; ++i) printf $i""FS; print "" }'

lauhub는 이 정확, 간단하고 빠른 솔루션을 제안 여기