열(헤더 포함)을 기준으로 파일을 분할하고 결과 파일의 이름을 바꾸려면 어떻게 해야 합니까?

열(헤더 포함)을 기준으로 파일을 분할하고 결과 파일의 이름을 바꾸려면 어떻게 해야 합니까?

다음과 같은 예가 있습니다 .txt.

NAME | CODE
name1 | 001
name2 | 001
name3 | 002
name4 | 003
name5 | 003
name6 | 003

이 파일을 열을 기준으로 분할하는 스크립트를 작성해야 하므로 CODE이 경우 다음과 같은 결과를 얻습니다.

file 1:
NAME | CODE
name1 | 001
name2 | 001

file 2:
NAME | CODE
name3 | 002

file 3:
NAME | CODE
name4 | 003
name5 | 003
name6 | 003

일부 연구에 따르면 awk를 사용하면 다음을 수행할 수 있습니다.

$ awk -F, '{print > $2".txt"}' inputfile

문제는 첫 번째 줄에 제목도 포함해야 하고 파일 이름도 달라야 한다는 것입니다. 예를 들어 001.txt, 필요한 파일 이름은 가 아닙니다 FILE_$FILENAME_IDK.txt.

답변1

다음을 시도해 볼 수 있습니다.

awk 'NR==1{h=$0; next}
!seen[$3]++{f="FILE_"FILENAME"_"$3".txt";print h > f} 
{print >> f}' infile

위의 내용은 헤더를 변수 h( )에 저장한 다음 표시되지 않는 NR==1{h=$0; next}경우 ( 즉, 처음 발생하는 경우 ) 현재 값을 설정합니다 .$3!seen[$3]++$3파일 이름( f=...)그리고 제목을 써주세요파일 이름( print h > f). 그런 다음 전체 줄을파일 이름( print >> f). 기본값 FS(필드 구분 기호)을 사용합니다.공백. |as FS(또는 와 함께 정규 표현식 gnu awk) 를 사용하려면 다음을 참조하세요.카스'아래에 댓글을 달아주세요.

답변2

누군가가 재치 있는 말을 해줄 수도 있겠지만 저는 스크립트를 작성해야 합니다.

in='inputfile'
header=$(head -n1 "$in")
codes=($(sed -n 's/.*| \([0-9]\+\)/\1/p' "$in" | uniq ))
for line in "${codes[@]}"; do
    out="file_$i.txt"
    echo "$header" > "$out"
    grep "|.* $line$" "$in" >> "$out"
done

관련 정보