mappings.csv
아래와 같이 CSV 가 있습니다 . null이 아닌 첫 번째 필드가 있는 각 레코드와 관련된 별도의 파일로 레코드 덩어리를 추출하고 싶습니다. 파일이 다음에 표시됩니다 mappings.csv
.
$ cat mappings.csv
TEST1,,,a,a,a,a
,,,b,b,b,b
,,,c,c,c,c
TEST2,,,aa,aa,aa,aa
,,,bb,bb,bb,bb
,,,cc,cc,cc,cc
,,,dd,dd,dd,dd
TEST3,,,aaa,aaa,aaa,aaa
,,,bbb,bbb,bbb,bbb
출력 파일은 mappings.csv
다음을 기반으로 합니다.
$ cat TEST1.csv
TEST1,,,a,a,a,a
,,,b,b,b,b
,,,c,c,c,c
$ cat TEST2.csv
TEST2,,,aa,aa,aa,aa
,,,bb,bb,bb,bb
,,,cc,cc,cc,cc
,,,dd,dd,dd,dd
$ cat TEST3.csv
TEST3,,,aaa,aaa,aaa,aaa
,,,bbb,bbb,bbb,bbb
awk를 사용하여 null이 아닌 첫 번째 필드가 있는 행을 인쇄할 수 있지만 다음 null이 아닌 첫 번째 필드까지 후속 레코드를 확장하고 인쇄하는 방법을 알 수 없습니다.
$ awk -F',' '$1' mappings.csv
TEST1,,,a,a,a,a
TEST2,,,aa,aa,aa,aa
TEST3,,,aaa,aaa,aaa,aaa
이 문제의 또 다른 측면은 결과를 별도의 파일로 분리하는 것입니다. 내가 할 수 있는 한 가지는 레코드 번호와 일치하는 줄을 인쇄하는 것입니다. 이 같은:
$ awk -F',' '$1 {print NR}' mappings.csv
1
4
8
답변1
이전에도 매우 유사한 질문이 제기되고 답변되었지만, 예를 들어 다음과 같습니다.
지정된 열의 null이 아닌 값에서만 파일 이름을 가져올 수 있는 정확한 중복 항목을 찾을 수 없습니다. 그래서 주어진:
$ cat mappings.csv
TEST1,,,a,a,a,a
,,,b,b,b,b
,,,c,c,c,c
TEST2,,,aa,aa,aa,aa
,,,bb,bb,bb,bb
,,,cc,cc,cc,cc
,,,dd,dd,dd,dd
TEST3,,,aaa,aaa,aaa,aaa
,,,bbb,bbb,bbb,bbb
그 다음에
awk -F, '$1 != "" {close(f); f = $1 ".csv"} {print > f}' mappings.csv
밝혀지다
$ head TEST*
==> TEST1.csv <==
TEST1,,,a,a,a,a
,,,b,b,b,b
,,,c,c,c,c
==> TEST2.csv <==
TEST2,,,aa,aa,aa,aa
,,,bb,bb,bb,bb
,,,cc,cc,cc,cc
,,,dd,dd,dd,dd
==> TEST3.csv <==
TEST3,,,aaa,aaa,aaa,aaa
,,,bbb,bbb,bbb,bbb
첫 번째 작업은 이름이 지정된 파일을 닫은 다음 f
(열린 파일이 있는 경우) f
첫 번째 필드의 (null이 아닌) 값을 suffix 와 연결하여 $1
새 값을 구성합니다 .csv
. 두 번째 작업은 변수의 (현재) 값이라는 파일에 레코드를 인쇄합니다 f
.비어 있으면 오류가 보고됩니다 f
. 이는 행이 있으면 발생합니다.앞으로null이 아닌 첫 번째 값$1
.
일부 awk 구현은 파일 닫기를 처리할 수 있으며, 이 경우 명시적으로 수행할 필요가 없습니다 close(f)
.