이 줄은 두 번째 필드에 공백이 생길 때까지 작동했습니다.
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-
-d
delimeter (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
다음과 같이 여분의 공백을 추가하지 않는 솔루션을 빌드하고 gensub
GNU 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 }'
-
여기서 -F “”는 awk가 사용할 구분자를 정의합니다. 필자의 경우 공백은 awk의 기본 구분 기호입니다. 이것은 -F “”를 무시할 수 있음을 의미합니다.
-
여기서 NF는 총 필드 / 컬럼 수를 정의합니다. 따라서 루프는 4 번째 필드부터 마지막 필드 / 열까지 시작합니다.
-
여기서 $ N은 N 번째 필드의 값을 검색합니다. 따라서 print $ i는 루프 카운트에 따라 현재 필드 / 열을 인쇄합니다.