쉘에서는 특정 컬럼이 필요할 때 awk로 파이프합니다.
이것은 9 열을 인쇄합니다. 예를 들면 다음과 같습니다.
... | awk '{print $9}'
9 열 뿐만 아니라 9 열을 포함한 모든 열을 인쇄하도록 awk에게 어떻게 알릴 수 있습니까?
답변:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
또는 perl
이를 위해. 당신이 정말로 그것을 가지고 있다고 주장하는 경우에만 이것을 사용하십시오 awk
.
다양한 필드를 수행하려는 awk
경우이 작업을 수행하는 직접적인 방법이 없습니다. cut
대신 다음을 권장 합니다.
cut -d' ' -f 9- ./infile
기본값이 탭이기 때문에 공백 필드 구분 기호를 추가했습니다. 이것을 지적 해준 Glenn에게 감사합니다.
find . | xargs ls -l | cut -d' ' -f 9-
. 어떤 이유로 이중 공백도 계산됩니다. 예 : lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
결과는 다음과 같습니다./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
편집 : 참고, 9 번째 이전의 필드에 9 번째와 동일한 값이 포함 된 경우이 기능이 작동하지 않습니다.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
가변 너비 공백을 처리하는 대신 모든 공백을 단일 공백으로 바꿉니다. 그런 다음 cut
관심 분야와 함께 간단하게 사용하십시오.
awk를 사용하지 않으므로 관련성이 없지만 다른 답변 / 댓글을 고려할 때 적절 해 보였습니다.
ps faux |
사용하기에 이상적입니다 . XYZ 도구가 가장 적절하지 않다는 것을 인정하는 것을 두려워하지 마십시오.
일반적으로 perl은 awk / sed / grep 등을 대체합니다. al., 훨씬 더 휴대 성이 뛰어납니다 (더 나은 주머니칼 일뿐만 아니라).
perl -lane 'print "@F[8..$#F]"'
물론 Timtowtdi가 적용됩니다.
-l
하거나 \n
print 문에 추가 해야합니다.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
이것은 주어진 필드 nr., N 앞에있는 것을 자르고, 필드 nr.N을 포함하고 원래의 간격을 유지하는 (재 형식화하지 않음) 나머지 라인을 모두 인쇄합니다. 필드의 문자열이 줄의 다른 어딘가에도 나타나는 경우에는 문제가되지 않으며 이는 Ascherer의 대답의 문제입니다.
함수 정의 :
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
다음과 같이 사용하십시오.
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
출력은 후행 공백을 포함하여 모든 것을 유지합니다. N = 0의 경우 전체 행을 그대로 반환하고 n> NF의 경우 빈 문자열을 반환합니다.
다음은 ls -l
출력 의 예입니다 .
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
게시물을 인쇄하는 내 솔루션 $9
은awk '{print substr($0, 61, 50)}'
처음 3 개 필드를 표시하고 나머지 필드를 인쇄하려면 다음을 사용할 수 있습니다.
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
여기서 $ 1 $ 2 $ 3은 처음 3 개 필드입니다.