아래와 같은 입력 파일이 있습니다.
N1518 AMP,AUG,AZM,CHL
N1520 AZM,NAL
N1524 AMP,NAL,STR
......
으로 변환하려고 합니다.
N1518 AMP
N1518 AUG
N1518 AZM
N1518 CHL
N1520 AZM
N1520 NAL
N1524 AMP
N1524 NAL
N1524 STR
....
이것을 할 수 있는 라이너가 있나요?
답변1
이 시도,
awk -F '[\t,]' '{for (i=2;i<NF;i++) print $1"\t"$i}' file
N1518 AMP
N1518 AUG
N1518 AZM
N1518 CHL
N1520 AZM
N1524 AMP
N1524 NAL
답변2
여러 구분 기호와 함께 awk를 사용한 다음 필드를 반복하여 열을 인쇄할 수 있습니다.
awk -F'[ ,]+' '{for (i=2;i<=NF;i++) {printf "%s %s\n",$1,$i;}}' file
설명하다:
-F'[ ,]+'
: 이는 awk에게 공백과 쉼표를 필드 구분 기호로 사용하도록 지시합니다. 또한 연속된 구분 기호를 단일 구분 기호로 처리하도록 지시합니다.
for (i=2;i<=NF;i++)
: 첫 번째 열을 반복적으로 인쇄해야 하므로 두 번째 열부터 시작하여 모든 열을 반복합니다.
printf "%s %s\n",$1,$i;
: 첫 번째 열과 i번째 열을 포함하는 행을 인쇄합니다.
답변3
다음 스크립트를 사용하여 테스트해 보면 효과도 매우 좋습니다.
행 개수 =awk '{print NR}' filename| sort -nr| sed -n '1p'
for ((i=1;i<=$count_line;i++)); do fi=`awk -v i="$i" 'NR==i{print $1}' filename`; h=`awk -v i="$i" 'NR==i{print $2}' filename|awk -F "," '{print NF}'| sort -nr | sed -n '1p'`; for ((j=1;j<=$h;j++)); do echo $fi;awk -v i="$i" -v j="$j" 'NR==i{print $2}' filename| awk -v j="$j" -F "," '{print $j}' ; done; done|sed "N;s/\n/ /g"
산출
N1518 AMP
N1518 AUG
N1518 AZM
N1518 CHL
N1520 AZM
N1520 NAL
N1524 AMP
N1524 NAL
N1524 STR
답변4
GNU sed
확장 정규식 패턴 옵션을 사용하면 -E
다음과 같이 문제를 구현할 수 있습니다.
$ sed -Ee 's/^((\S+\t)[^,]+),/\1\n\2/;P;D' inp
산출:
N1518 AMP
N1518 AUG
N1518 AZM
N1518 CHL
N1520 AZM
N1520 NAL
N1524 AMP
N1524 NAL
N1524 STR