세 번째 열에 마지막 열로 인쇄하는 방법?
-
05-07-2019 - |
문제
DBGView 로그 파일에서 처음 두 열을 제거하려고합니다. 3 열에서 줄이 끝날 때까지 인쇄하는 예를 찾을 수없는 것 같습니다. 각 라인에는 가변 수의 열이 있습니다.
해결책
... 또는 더 간단한 솔루션 : cut -f 3- INPUTFILE
올바른 구분 기자 (-d)를 추가하면 동일한 효과가 있습니다.
다른 팁
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
여기에서 찾은 솔루션 :
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-179078/
조나단 페인버그대답은 각 필드를 별도의 라인에 인쇄합니다. 당신은 사용할 수 있습니다 printf
같은 선에서 출력 레코드를 재구성하려면 필드를 왼쪽으로 이동할 수도 있습니다.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file
NB :이 방법은 "공백"을 1,2,3 필드로 남겨 두지 만 출력을보고 싶다면 문제가되지 않습니다.
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
이것은 주어진 필드 nr., n 이전에 무엇을 잘라 내고, 필드 NR.N 및 원래 간격을 유지 관리하는 것을 포함하여 나머지 모든 라인을 인쇄합니다 (개혁하지 않음). 필드의 줄이 줄에 다른 곳에 나타나면 Daisaa의 대답에 문제가있는 경우에는 요약되지 않습니다.
함수 정의 :
fromField () {
awk -v m="\x0a" -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'이 레코드 분리기 인 파일에 적합하므로 라인 안에 새로운 라인 숯이 없습니다. 다른 레코드 분리기와 함께 사용하려면 다음을 사용하십시오.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
예를 들어. 16 진수 NR을 사용하지 않는 한 거의 모든 파일과 잘 작동합니다. 1 라인 내부.
다음 선은 어떻습니까 :
awk '{$1=$2=$3=""; print}' file
@ghostdog74 제안을 기반으로합니다. 선을 걸러 내면 내 것이 더 잘 행동해야합니다.
awk '/^exim4-config/ {$1=""; print }' file
예를 들어 세 번째 후에도 같은 줄에 열을 인쇄하려면 다음을 사용할 수 있습니다.
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
예를 들어:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
인쇄 할 것입니다 :
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
우리가 볼 수 있듯이, PaySlip은 공간이있는 경우에도 올바른 선으로 표시됩니다.
다음 AWK 명령은 각 라인의 마지막 n 필드를 인쇄하고 라인 끝에서 새로운 라인 문자를 인쇄합니다.
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
아래에서 /usr /bin 디렉토리의 내용을 나열한 다음 마지막 3 줄을 보유한 다음 awk를 사용하여 각 라인의 마지막 4 개의 열을 인쇄하는 예를 아래에서 찾으십시오.
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
글쎄, 당신은 정규 표현식을 사용하여 동일한 효과를 쉽게 달성 할 수 있습니다. 분리기가 공간이라고 가정하면 다음과 같습니다.
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
Perl 솔루션 :
perl -lane 'splice @F,0,2; print join " ",@F' file
이 명령 줄 옵션은 다음과 같습니다.
-n
입력 파일의 모든 줄 주위를 루프하고 모든 라인을 자동으로 인쇄하지 마십시오.-l
처리하기 전에 최신 라인을 제거하고 나중에 다시 추가합니다.-a
AutoSplit 모드 - 입력 라인을 @F 배열로 분할합니다. 기본적으로 공백에서 분할됩니다-e
Perl 코드를 실행하십시오
splice @F,0,2
@F 배열에서 열 0과 1을 깨끗하게 제거합니다.
join " ",@F
각 요소 사이의 공간을 사용하여 @F 배열의 요소에 결합합니다.
입력 파일이 공간에 세워지지 않고 Comma 지분 인 경우 사용하십시오. -F, -lane
파이썬 솔루션 :
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
awk '{a=match($0, $3); print substr($0,a)}'
먼저 세 번째 열의 시작 위치를 찾습니다. Substr은 위치 (이 경우 A)에서 시작하여 라인 ($ 0)을 라인의 끝까지 인쇄합니다.
여기에서 조금 늦었지만 위의 어느 것도 효과가없는 것 같았습니다. printf를 사용하여 각각을 시도하십시오. 나는 마지막에 Newline을 갖지 않기로 결정했습니다.
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
원본 파일에있는 것과 동일한 순서로 4 번째 필드에서 마지막 필드까지의 레코드를 인쇄합니다.
Bash에서는 위치 매개 변수와 함께 다음 구문을 사용할 수 있습니다.
while read -a cols; do echo ${cols[@]:2}; done < file.txt
더 알아보기: 위치 매개 변수 처리 Bash Hackers Wiki에서
처음 두 필드를 무시하고 해당 필드를 가릴 때 공간을 원하지 않는다면 (위의 답변과 같이) :
awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
처음 두 열이 지워집니다. sed
선행 공간을 제거합니다.
awk 열에서 필드라고하는 열에서는 NF가 핵심입니다.
모든 행 :
awk -F '<column separator>' '{print $(NF-2)}' <filename>
첫 번째 행 전용 :
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>