쉼표는 단어를 새 줄로 구분합니다.

쉼표는 단어를 새 줄로 구분합니다.

아래와 같은 입력 파일이 있습니다.

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

관련 정보