답변:
... 또는 더 간단한 해결책 : cut -f 3- INPUTFILE
올바른 구분 기호 (-d)를 추가하면 동일한 효과를 얻을 수 있습니다.
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
( 다른 필드가 인쇄 된 후 printf
개행 문자를 print ""
추가 하는 동안 개행 문자를 인쇄하지 않음 )
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, 이는 다음을 제공합니다 3 4 5 6 7 8 9 10
..
awk '{ print substr($0, index($0,$3)) }'
해결책은 여기에서 찾을 수 있습니다 :
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
Jonathan Feinberg 의 답변은 각 필드를 별도의 줄에 인쇄합니다. 을 사용 printf
하여 동일한 행에 출력 할 레코드를 다시 작성할 수 있지만 필드를 왼쪽으로 이동하면됩니다.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
POSIX 에서는 감소 가 허용되지 않습니다.
NF
감소 가능 여부에 대해 침묵하는 것처럼 보입니다 .
awk '{$1=$2=$3=""}1' file
주의 :이 방법은 1,2,3 필드에 "공백"을 남기지 만 출력 만보고 싶다면 문제가되지 않습니다.
1
은 무엇을 의미합니까? 어떤 키워드로 검색해야 awk
합니까?
{$1=$2=$3="";$0=$0;$1=$1}1
예를 들어 같은 줄에서 세 번째 이후의 열을 인쇄하려면 다음을 사용할 수 있습니다.
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
보시다시피, 급여 명세서는 공백이 있어도 올바른 줄에 표시됩니다.
다음 줄은 어떻습니까?
awk '{$ 1 = $ 2 = $ 3 = ""; print} '파일
@ ghostdog74 제안을 기반으로합니다. 내 라인을 필터링 할 때 더 잘 작동해야합니다.
awk '/ ^ exim4-config / {$ 1 = ""; } '파일 인쇄
sed 's/\s\+//g'
명령 끝에 파이프 및 추가 하여 선행 공백을 다듬을 수 있습니다.
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 진수 문자 번호를 사용하지 않는 한 거의 모든 파일에서 잘 작동합니다. 라인 안에 1 개.
다음 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
Perl 솔루션 :
perl -lane 'splice @F,0,2; print join " ",@F' file
다음 명령 줄 옵션이 사용됩니다.
-n
입력 파일의 모든 줄을 반복하고 모든 줄을 자동으로 인쇄하지 않음
-l
처리하기 전에 줄 바꿈을 제거하고 나중에 다시 추가합니다.
-a
자동 분할 모드 – 입력 라인을 @F 배열로 분할합니다. 공백으로 분할하는 기본값
-e
Perl 코드 실행
splice @F,0,2
@F 배열에서 열 0과 1을 깨끗하게 제거합니다.
join " ",@F
각 요소 사이에 공백을 사용하여 @F 배열의 요소를 결합합니다.
입력 파일이 공백으로 구분되지 않고 쉼표로 구분 된 경우 다음을 사용하십시오. -F, -lane
Python 솔루션 :
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
Bash에서는 위치 매개 변수와 함께 다음 구문을 사용할 수 있습니다.
while read -a cols; do echo ${cols[@]:2}; done < file.txt
자세히 알아보기 : Bash Hackers Wiki에서 위치 매개 변수 처리
AWK에서 열은 필드라고하므로 NF가 핵심입니다.
모든 행 :
awk -F '<column separator>' '{print $(NF-2)}' <filename>
첫 번째 행만 :
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>