너무 번거 로움 :
awk '{print " "$4" "$5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13}' things
답변
추가 선행 또는 후행 공백을 추가하지 않는 솔루션 :
awk '{ for(i=4; i<NF; i++) printf "%s",$i OFS; if(NF) printf "%s",$NF; printf ORS}'
### Example ###
$ echo '1 2 3 4 5 6 7' |
awk '{for(i=4;i<NF;i++)printf"%s",$i OFS;if(NF)printf"%s",$NF;printf ORS}' |
tr ' ' '-'
4-5-6-7
Sudo_O 는 삼항 연산자를 사용하여 우아한 개선을 제안합니다.NF?ORS:OFS
$ echo '1 2 3 4 5 6 7' |
awk '{ for(i=4; i<=NF; i++) printf "%s",$i (i==NF?ORS:OFS) }' |
tr ' ' '-'
4-5-6-7
EdMorton 은 필드 사이의 원래 공백을 보존하는 솔루션을 제공합니다.
$ echo '1 2 3 4 5 6 7' |
awk '{ sub(/([^ ]+ +){3}/,"") }1' |
tr ' ' '-'
4---5----6-7
BinaryZebra 는 또한 두 가지 멋진 솔루션을 제공합니다.
(이 솔루션은 원래 문자열의 후행 공백도 보존합니다)
$ echo -e ' 1 2\t \t3 4 5 6 7 \t 8\t ' |
awk -v n=3 '{ for ( i=1; i<=n; i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 ' |
sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
"4...5...6.7.->.8->."
$ echo -e ' 1 2\t \t3 4 5 6 7 \t 8\t ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }' |
sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
"4...5...6.7.->.8->."
주석에서 larsr 에 의해 제공된 솔루션 은 거의 정확합니다.
$ echo '1 2 3 4 5 6 7' |
awk '{for (i=3;i<=NF;i++) $(i-2)=$i; NF=NF-2; print $0}' | tr ' ' '-'
3-4-5-6-7
다음은 larsr 솔루션 의 고정 및 매개 변수화 된 버전입니다 .
$ echo '1 2 3 4 5 6 7' |
awk '{for(i=n;i<=NF;i++)$(i-(n-1))=$i;NF=NF-(n-1);print $0}' n=4 | tr ' ' '-'
4-5-6-7
2013 년 9 월 이전의 다른 모든 답변은 좋지만 공백을 추가하십시오.
-
$ echo '1 2 3 4 5 6 7' | awk '{$1=$2=$3=""}1' | tr ' ' '-' ---4-5-6-7
-
추가 후행 공백을 추가 하는 답변의 예
$ echo '1 2 3 4 5 6 7' | awk '{for(i=4;i<=13;i++)printf "%s ",$i;printf "\n"}' | tr ' ' '-' 4-5-6-7-------
답변
awk '{for(i=1;i<4;i++) $i="";print}' file
답변
컷 사용
$ cut -f4-13 file
또는 awk를 고집하고 $ 13이 마지막 필드 인 경우
$ awk '{$1=$2=$3="";print}' file
그밖에
$ awk '{for(i=4;i<=13;i++)printf "%s ",$i;printf "\n"}' file
답변
이 시도:
awk '{ $1=""; $2=""; $3=""; print $0 }'
답변
이를 수행하는 올바른 방법은 단순히 건너 뛸 필드 수를 지정하고 나머지 필드에 대한 필드 간 간격을 유지하기 때문에 RE 간격을 사용하는 것입니다.
예를 들어이 질문에서 논의하는 것처럼 보이는 입력 형식을 고려하여 나머지 필드 사이의 간격에 영향을주지 않고 처음 3 개 필드를 건너 뛰는 것은 간단합니다.
$ echo '1 2 3 4 5 6' |
awk '{sub(/([^ ]+ +){3}/,"")}1'
4 5 6
선행 공백과 공백이 아닌 공백을 수용하고 싶지만 기본 FS를 다시 사용하려면 다음과 같습니다.
$ echo ' 1 2 3 4 5 6' |
awk '{sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"")}1'
4 5 6
RE 인 FS가있는 경우 문자 집합에서 부정 할 수없는 경우 먼저 단일 문자로 변환 할 수 있습니다 (RS가 필드 내에 나타날 수 없기 때문에 단일 문자 인 경우 RS가 이상적이며 그렇지 않으면 SUBSEP를 고려하십시오). 그런 다음 RE 간격 대체를 적용한 다음 OFS로 변환합니다. 예를 들어 “.”체인이 필드를 구분하는 경우 :
$ echo '1...2.3.4...5....6' |
awk -F'[.]+' '{gsub(FS,RS);sub("([^"RS"]+["RS"]+){3}","");gsub(RS,OFS)}1'
4 5 6
분명히 OFS가 단일 문자이고 입력 필드에 나타날 수없는 경우 다음과 같이 줄일 수 있습니다.
$ echo '1...2.3.4...5....6' |
awk -F'[.]+' '{gsub(FS,OFS); sub("([^"OFS"]+["OFS"]+){3}","")}1'
4 5 6
그러면 필드를 재 할당하는 모든 루프 기반 솔루션과 동일한 문제가 발생합니다. FS는 OFS로 변환됩니다. 이것이 문제라면 GNU awks의 patsplit () 함수를 살펴 봐야합니다.
답변
거의 모든 답변은 현재 선행 공백, 후행 공백 또는 기타 구분 기호 문제를 추가합니다. 구분자가 공백이고 출력 구분자가 단일 공백 인 네 번째 필드에서 선택하려면 다음을 사용 awk
합니다.
awk '{for(i=4;i<=NF;i++)printf "%s",$i (i==NF?ORS:OFS)}' file
시작 필드를 매개 변수화하려면 다음을 수행 할 수 있습니다.
awk '{for(i=n;i<=NF;i++)printf "%s",$i (i==NF?ORS:OFS)}' n=4 file
또한 엔딩 필드 :
awk '{for(i=n;i<=m=(m>NF?NF:m);i++)printf "%s",$i (i==m?ORS:OFS)}' n=4 m=10 file
답변
awk '{$1=$2=$3="";$0=$0;$1=$1}1'
입력
1 2 3 4 5 6 7
산출
4 5 6 7