입력 파일
jayesh 30,20,50,60 30:20:40,60:55 A AB,KL,CD SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAA,BCD,RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K,L SD20,SD39
5번째 열에서 쉼표를 제거하고 새 행에 쉼표 뒤의 단어를 인쇄하고 싶습니다. (참고: - 5번째 열의 각 셀에는 많은 쉼표가 포함되어 있지만 몇 개만 표시하고 있습니다.)
예상 출력
jayesh 30,20,50,60 30:20:40,60:55 A AB SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD SM1,SM2
rahul 10,80,50,90,120 25:55:60,25 SGF AAAA SM3,SM4,SM4
rahul 10,80,50,90,120 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90,120 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K SD20,SD39
sarika 10,20,48 29:50:30,25 T L SD20,SD39
awk를 사용하여 다음을 시도했지만 예상한 결과를 얻지 못했습니다. (코드를 작성하기 위해 이 웹사이트의 도움을 받았습니다.쉼표를 제거하고 쉼표 뒤의 전체 단어 줄을 다시 인쇄하는 방법)
awk '{
split ($5,w5,",");
for (i in w5)
{ print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6";}}'
@sundeep, 입력 파일에 다음 명령을 시도하면 열 5와 6이 서로 혼합됩니다. (여기에는 총 6개의 열만 표시되어 있지만 내 파일에는 6개 이상의 열이 있습니다.)
Excel에서 출력 파일을 열면 다음과 같은 출력이 나타납니다.
산출
$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt
jayesh 30,20,50,60 30:20:40,60:55 A "ABSM1,SM2"
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD" SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAASM3,SM4,SM4"
rahul 10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF RTY" SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T KSD20,SD39"
sarika 10,20,48 29:50:30,25 T L" SD20,SD39
답변1
awk
OP에서 사용하는 명령에 구문 문제가 있어 ";
명령문 끝이 인쇄됩니다.
$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt
jayesh 30,20,50,60 30:20:40,60:55 A AB SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAA SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K SD20,SD39
sarika 10,20,48 29:50:30,25 T L SD20,SD39
또한 제안에 대한 @fedorqui 덕분에 더 깔끔한 구문을 위해 출력 필드 구분 기호를 설정할 수 있습니다.
awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { print $1,$2,$3,$4,w5[i],$6 } }' ip.txt
또는
awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { $5 = w5[i]; print } }' ip.txt
유사한 솔루션perl
$ perl -lane 'print join "\t", @F[0..3],$_,@F[5..$#F] foreach split /,/,$F[4]' ip.txt
jayesh 30,20,50,60 30:20:40,60:55 A AB SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAA SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K SD20,SD39
sarika 10,20,48 29:50:30,25 T L SD20,SD39