awk를 사용하여 특정 번호 뒤에있는 모든 열을 인쇄하는 방법은 무엇입니까?
쉘에서는 특정 컬럼이 필요할 때 awk로 파이프합니다.
이것은 9 열을 인쇄합니다. 예를 들면 다음과 같습니다.
... | awk '{print $9}'
9 열 뿐만 아니라 9 열을 포함한 모든 열을 인쇄하도록 awk에게 어떻게 알릴 수 있습니까?
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
다양한 필드를 수행하고 싶을 때이 작업을 수행 awk
하는 직접적인 방법이 없습니다. cut
대신 다음을 권장 합니다.
cut -d' ' -f 9- ./infile
편집하다
기본값이 탭이기 때문에 공백 필드 구분 기호를 추가했습니다. 이것을 지적 해준 Glenn에게 감사합니다.
awk '{print substr($0, index($0,$9))}'
편집 : 아홉 번째 이전의 필드에 아홉 번째와 동일한 값이 포함 된 경우이 기능이 작동하지 않습니다.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
가변 너비 공백을 처리하는 대신 모든 공백을 단일 공백으로 바꿉니다. 그런 다음 cut
관심 분야와 함께 간단하게 사용하십시오.
awk를 사용하지 않기 때문에 밀접하지 않지만 다른 답변 / 댓글을 감안할 때 적절 해 보였습니다.
일반적으로 perl은 awk / sed / grep 등을 대체합니다. al., 훨씬 더 휴대 성이 뛰어납니다 (더 나은 주머니칼 일뿐만 아니라).
perl -lane 'print "@F[8..$#F]"'
물론 Timtowtdi가 적용됩니다.
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의 경우 빈 문자열을 반환합니다.
ruby -lane 'print $F[3..-1].join(" ")' file
처음 3 개 필드를 표시하고 나머지 필드를 인쇄하려면 다음을 사용할 수 있습니다.
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
여기서 $ 1 $ 2 $ 3은 처음 3 개 필드입니다.
다음은 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)}'
function print_fields(field_num1, field_num2){
input_line = $0
j = 1;
for (i=field_num1; i <= field_num2; i++){
$(j++) = $(i);
}
NF = field_num2 - field_num1 + 1;
print $0
$0 = input_line
}
awk 대신 cut을 사용하고 -c 문자 cut 명령을 사용하여 시작할 열을 파악하는 문제를 해결합니다.
여기서는 출력의 처음 49자를 제외한 모든 것을 제공합니다.
ls -l /some/path/*/* | cut -c 50-
/*/*/
ls 명령의 끝에도 하위 디렉토리에 어떤 쇼 저를 말하고있다.
특정 범위의 문자 ala를 꺼낼 수도 있습니다 (잘라낸 맨 페이지에서). 예를 들어, 현재 로그인 한 사용자의 이름과 로그인 시간을 표시합니다.
who | cut -c 1-16,26-38
'program tip' 카테고리의 다른 글
두 배열 결합 (0) | 2020.10.18 |
---|---|
postgreSQL에서 왼쪽으로 0 채우기 (0) | 2020.10.18 |
bash 스크립트를 사용하여 텔넷 세션 자동화 (0) | 2020.10.18 |
Android TextField : 프로그래밍 방식으로 포커스 + 소프트 입력 설정 (0) | 2020.10.18 |
인증 프록시 뒤의 Windows에서 pip를 사용하는 방법 (0) | 2020.10.18 |