다음과 같은 예가 있습니다 .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