수행해야 할 작업의 예를 보여줍니다.
입력:
name value1 value2 value3
john xxxxx yyyyy qqqqqq
john xxxxx ddddd vvvvvv
john mmmmm jjjjj llllll
paul xxxxx yyyyy qqqqqq
paul ccccc ccccc dddddd
헤더를 유지 하고 첫 번째 열에서 같은 이름 으로 파일로 분할해야합니다 . 첫 번째 열에 따라 출력 파일의 이름을 계속 지정해야합니다.
산출:
파일 1 : john.tsv
name value1 value2 value3
john xxxxx yyyyy qqqqqq
john xxxxx ddddd vvvvvv
john mmmmm jjjjj llllll
파일 2 : paul.tsv
name value1 value2 value3
paul xxxxx yyyyy qqqqqq
paul ccccc ccccc dddddd
INPUT 및 OUTPUT 파일은 탭으로 구분됩니다. 헤더는 항상 동일합니다.
내 솔루션은 매우 복잡하고 느립니다.
head -1 INPUT > header
awk 'NR>1{print $1}' | sort | uniq > names
while read line
do grep $line INPUT | cat header - > $line.tsv
< names
done
지금까지 게시 된 모든 답변에는 취약하거나 이식 할 수없는 문제가 있습니다 (예 : 결과를 확인하지 않고 getline 사용, 출력 리디렉션의 괄호로 묶지 않은 오른쪽, gawk 특정 기능 사용, 각 출력 파일을 닫지 않음) 완료되면) 및 / 또는 불필요하게 복잡합니다.
헤더를 유지하면서 처음 2 개 열을 기준으로 입력 파일을 정렬하는 방법은 다음과 같습니다.
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort | cut -f2-
name value1 value2 value3
john mmmmm jjjjj llllll
john xxxxx ddddd vvvvvv
john xxxxx yyyyy qqqqqq
paul ccccc ccccc dddddd
paul xxxxx yyyyy qqqqqq
헤더 행을 포함하여 입력을 강력하고 이식 가능하며 효율적으로 인쇄하여 첫 번째 열을 기준으로 명명 된 파일을 분리하려면 다음과 같이하십시오.
$ cat tst.awk
NR==1 { hdr=$0; next }
$1 != prev {
close(out)
out = $1 ".tsv"
print hdr > out
prev = $1
}
{ print > out }
따라서 모두 합치면 다음과 같습니다.
awk -v OFS='\t' '{print (NR>1), $0}' file | sort | cut -f2- | awk -f tst.awk
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다