![awk를 통해 파일 분할](https://linux55.com/image/208600/awk%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%ED%8C%8C%EC%9D%BC%20%EB%B6%84%ED%95%A0.png)
이것은 "\t"로 구분된 세 개의 열을 포함하는 내 파일입니다. 두 번째 열의 구분 기호는 비어 있습니다.
1 a b tom
2 a b c sim
3 a mary
4 o l shey
5 c bob
두 번째 열에 여러 요소가 포함된 첫 번째 파일을 가져오고 싶습니다.
1 a b tom
2 a b c sim
4 o l shey
그런 다음 이와 같은 두 번째 파일을 얻고 싶습니다.
1 a tom
1 b tom
2 a sim
2 b sim
2 c sim
4 o shey
4 l shey
사실 나도 시도해봤어
awk -F\\t 'BEGIN {OFS=FS} {n=split($2,aa," ");for (i=1;i<=n;i++) {$2=aa[i]; printf "%s\n" $0 }}'
그러나 그것은 쓸모없는 것 같습니다. 몇 가지 제안을 해주실 수 있나요? 감사해요.
답변1
$ awk 'NF>3' file
1 a b tom
2 a b c sim
4 o l shey
$ awk -v OFS='\t' 'NF>3{for (i=2;i<NF;i++) print $1, $i, $NF}' file
1 a tom
1 b tom
2 a sim
2 b sim
2 c sim
4 o shey
4 l shey
코드가 작동하지 않는 이유에 대해 가장 명백한 문제는 공백으로 구분되어 있다고 말하고 표시할 때 쉼표로 구분하려고 split($2,aa,",")
하는 것 입니다.$2
답변2
두 번째 단계에서는 밀러의 대체 솔루션과 필드 2의 공백을 기반으로 레코드를 선택하는 아이디어를 사용합니다(필드 2에 두 개 이상의 요소가 있는 경우에만 공백이 발생한다고 가정).
awk -F'\t' '$2 ~ / /' |
tee out1 |
mlr --tsv -N nest --explode --values --across-records --nested-fs " " -f 2 >out2