필드 수를 모르고 CSV의 각 필드를 줄바꿈으로 인쇄합니다.

필드 수를 모르고 CSV의 각 필드를 줄바꿈으로 인쇄합니다.

저는 오늘 IFS를 가지고 놀면서 한 줄에 쉼표로 구분된 숫자 목록이 포함된 빠른 텍스트 파일을 만들었습니다.

1,2,3,4,5

그런 다음 개행 문자에 각 숫자를 인쇄하는 스크립트를 작성해 보았습니다. 작동하게 할 수는 있지만 얼마나 많은 필드가 있는지 알아야 합니다. 더 긴 목록에서 이 작업을 수행하는 방법을 찾으려고 노력 중이며 모든 필드를 지정하고 싶지는 않습니다.

#!/bin/bash
IFS=,
while read num1 num2 num3 num4 num5
do
printf $num1"\n"
printf $num2"\n"
printf $num3"\n"
printf $num4"\n"
printf $num5"\n"
printf "\n"
done < "$1"

결과는 다음과 같습니다.

keismbp13b:tmp$ ./ifs.sh list
1
2
3
4
5
keismbp13b:tmp$

개행 문자에서 목록을 분리하려면 awk 또는 이와 유사한 것을 사용해야 할 수도 있지만 다른 방법이 있는지 궁금합니다.

감사해요!

게시한 후 나도 이것을 할 수 있다는 것을 깨달았습니다.

tr , "\n" < list

어쨌든 목록을 먼저 분리하지 않고 이 작업을 수행할 수 있습니까?

답변1

귀하의 질문에서 지적했듯이 tr다음을 사용하여 이 작업을 수행할 수 있습니다.

tr ',' '\n' < infile

이를 수행하는 다른 옵션은 다음과 같습니다.

sed -e $'s/,/\\\n/g' infile

또는:

sed 's/,/\
/g' infile.txt

또는 일부 sed구현에서는 다음을 사용합니다.

sed 's/,/\n/g' infile

또는 다음을 통해 awk(마지막 빈 줄이 마음에 들지 않는 경우):

awk -v RS=',' '1' infile

또는 bash:

#!/bin/bash
while IFS='' read -r line; do 
    echo "${line//,/$'\n'}";
done < infile

또는 배열을 읽은 후 다음을 수행하십시오 printf.

#!/bin/bash
while IFS=, read -a fields; do
    printf "%s\n" "${fields[@]}";
done < infile
  • ..., 2 4, ...각 필드는 위와 같이 쉼표로 구분되어 있습니다 . 그렇지 않으면 IFSfrom IFS=','to 에 추가하여 IFS=', '개별적으로 인쇄할 수 있습니다.

관련 정보