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]*
입력 라인에 선행 공백을 허용하는 데 사용됩니다.
grep | awk
은 반 패턴입니다 – 당신은awk '/!/ { print $2 }'