在不知道字段数量的情况下按换行符打印 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=','toIFS=', '中以单独打印。

相关内容