word3,a,b,c,d,e
필드 구분 기호()가 포함된 마지막 필드를 인쇄하는 방법은 무엇입니까 ,
?
한 줄에 3개의 단어/문자열만 있으며 구조는 다음과 같습니다.
유형, 매개변수, 값
그러나 값에는 이스케이프 처리되지 않은 필드 구분 기호 자체가 포함될 수 있습니다. 라인 예:
echo word1,word2,word3,a,b,c,d,e | awk -F "," '{print $3}'
다음과 같이 인쇄됩니다.
word3
예상 결과:
word3,a,b,c,d,e
다른 예
echo 32637,921763.373,str84,str42,struj,str56,str65 | awk -F "," '{print $3}'
예상 결과:
str84,str42,struj,str56,str65
답변1
따라서 마지막 필드 word1,word2,word3,a,b,c,d,e
는 e
이고 세 번째 필드는 입니다 word3
. 세 번째 필드부터 시작하는 줄 부분을 원하는 것 같습니다. 다음을 사용하는 것이 더 쉽습니다 cut
.
$ echo word1,word2,word3,a,b,c,d,e | cut -d , -f 3-
word3,a,b,c,d,e
-f 3-
-f x-y
x~y 필드에 적용되지만 생략되어 세 번째 필드 에서 마지막 필드로 y
이동합니다 .
행에 3개 이상의 필드가 포함되어 있다고 가정합니다. 2개의 필드가 포함된 입력 줄에 대해 빈 출력 줄을 제공하고 쉼표가 포함되어 있지 않으면 줄을 변경하지 않고 그대로 둡니다( -s
구분되지 않은 줄을 건너뛰는 옵션을 추가할 수 있음).
$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -d , -f 3-
a
c
c,d
$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -sd , -f 3-
c
c,d
이를 통해 awk
다음을 수행할 수 있습니다.
$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,[^,]*,/, "")'
c
c,d
( awk 'sub(/^([^,]*,){2}/, "")'
이 변형은 POSIX이지만 정규식 연산자를 awk
지원하지 않는 일부 구현이 여전히 있기 때문에 이식성이 떨어집니다.){x,y}
처음 2개 필드를 제거하고 제거된 행만 인쇄하려면 와 마찬가지로 awk
prettification 으로 사용됩니다 .sed
sed -n 's/^[^,]*,[^,]*,//p'
또는:
$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,?[^,]*,?/, "")'
c
c,d
3개 미만의 필드가 있는 줄에 대해 빈 줄을 인쇄합니다.
답변2
방법 awk
은 다음과 같습니다
awk -F "," '{for(i=3;i<NF;i++)printf("%s,", $i);print $NF}'
하지만 그것은 직업처럼 들립니다 cut
.
cut -d , -f 3-
답변3
배열 슬라이싱 기능을 활용하여 사용하세요( 에서와 같은 루프가 필요하지 않음 perl
).for
awk
$ echo word1,word2,word3,a,b,c,d,e | perl -F, -lane 'print join(",",@F[2..$#F])'
word3,a,b,c,d,e
perl
사용된 명령줄 옵션에 대한 설명( man perlrun
자세한 내용은 참고자료 참조):
-F,
자동 분할 필드 구분 기호를 다음으로 설정합니다.,
-l
자동 줄 끝 처리를 활성화합니다(즉, 각 입력 줄의 끝에서 자동으로 줄 바꿈을 제거하고 각print
-ed 출력 줄에 추가합니다).-a
자동 분할 모드 켜기 - 각 입력 라인이 자동으로 배열로 분할됩니다@F
.-n
표준 입력 및/또는 파일 이름 인수의 각 줄을 읽고 처리합니다(기본적으로while(<>)
전체 스크립트를 둘러싼 루프).-e
다음 인수(따옴표로 묶인 문자열)를 Perl 스크립트로 실행합니다.
참고: perl
배열은 1 기반이 아닌 0 기반이므로 세 번째 필드는 3이 아닌 배열 요소 2입니다(예 @F[2]
:아니요 @F[3]
).
$#F
는 배열의 마지막 요소의 인덱스 번호 @F
이므로 " 배열의 세 번째 요소부터 마지막 요소까지의 모든 요소"를 @F[2..$#F]
의미합니다 .@F
그런데, 각 루프의 끝에서 입력 라인도 인쇄한다는 점을 제외하면 -p
매우 유사한 또 다른 옵션이 있습니다 . 이전 명령문에 의해 입력 행이 수정된 경우 해당 행은 수정된 상태로 인쇄됩니다.-n
while(<>)
그 용도 중 하나는 매우 유사한 스크립트를 작성할 수 있다는 것입니다 (그러나 를 sed
제외한 perl
모든 기능과 구문 설탕은 포함). 예를 들어 동일한 입력이 주어지면 동일한 출력이 발생합니다.perl
sed
perl -pe 's/foo/bar/g'
sed -e 's/foo/bar/g'
다시 말하지만, -n
이 조합을 사용하면 매우 유사한 스크립트를 -a
쉽게 작성할 수 있습니다 . awk
실제로 이것은 한 줄 같은 것을 perl -lane
작성하는 표준 방법과 거의 같습니다 .awk
perl
perl
장점 중 하나 는sed
awk
tr
CPAN
답변4
사용 sed
:
sed 's/^\([^,]*,\)\{0,2\}//' <<<"$line"