이 명령을 사용하여 csv 형식으로 출력을 얻습니다.
awk 'ORS="," {print $2}'
다음 형식으로 출력됩니다.
a,b,c,name,col1,col2,col3,
여기서는 "name"과 "name" 앞의 모든 항목을 제거하고 열 이름만 가져오고 싶습니다. 열 이름에는 제거하고 싶지 않은 작동하는 "이름"이 있을 수도 있습니다. 따라서 이름이 처음 나타나는 부분만 삭제할 수 있습니다. awk로 할 수 있나요?
나는 시도했다:
awk 'NR >4 {print $2}' | awk '{ORS=","}'
다양한 조합이 가능하지만 아무 것도 작동하지 않습니다.
답변1
원본 파일의 각 줄에 있는 두 번째 필드인 경우 해당 필드를 선택하면서 테스트할 수 있습니다 a,b,c,name,col1,col2,col3,
(이렇게 해도 여전히 성가신 마지막 쉼표가 남습니다).name
$ awk -vORS=, 'p {print $2}; $2 == "name" {p=1} ' input; echo
col1,col2,col3,
따라서 awk 'ORS="," {print $2}'
가지고 있는 항목( )부터 시작하여 해당 항목이 표시되었는지 p
확인하는 테스트 변수를 추가합니다. name
두 번째 필드는 이전에 true 값으로 설정된 경우에만 인쇄하고, p
두 번째 필드가 이면 true로 설정합니다 name
. 이 순서로 테스트하면 name
열 자체가 인쇄되지 않습니다. p {print $2}
로 변경하여 입력의 빈 줄을 무시할 수도 있습니다 $0 && p {print $2}
. 즉, 인쇄 조건으로 실제(비어 있지 않은) 입력 줄을 포함합니다 p
.
여기서는 원래 입력이 다음과 같다고 가정합니다.
x a
x b
x c
x name
x col1
x col2
x col3
또는 쉼표로 구분된 목록으로 시작하세요 a,b,c,name,somename,othername,col3,
.
$ echo 'a,b,c,name,somename,othername,col3,' |
sed -e 's/.*,name,//' -e s'/,$//'
somename,othername,col3
,name,
패턴 양쪽에 있는 쉼표를 참고하세요. 이는 .*
로 끝나는 후속 이름을 탐욕스럽게 캡처하는 것을 방지합니다 ...name
.
답변2
파일 내용이 다음과 같다고 가정합니다.
$ cat myfile
a,b,c,name,col1,col2,col3,forename,surname,name5,foo,name,name6
$
awk
해결책
$ awk -F',name,' '{print substr($0,index($0,$2))}' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$
perl
해결책.
$ perl -pe 's/^.*?name,//' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$