저는 오늘 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, ...
각 필드는 위와 같이 쉼표로 구분되어 있습니다 . 그렇지 않으면IFS
fromIFS=','
to 에 추가하여IFS=', '
개별적으로 인쇄할 수 있습니다.