null이 아닌 각 첫 번째 열의 문자열을 기반으로 명명된 별도의 파일로 행을 추출합니다.

null이 아닌 각 첫 번째 열의 문자열을 기반으로 명명된 별도의 파일로 행을 추출합니다.

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).

관련 정보