Kei*_*non 7 bash text-processing csv-simple
我今天在玩 IFS 并创建了一个快速文本文件,其中包含在 1 行上用逗号分隔的数字列表。
1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)
然后我尝试编写一个脚本来在换行符上打印每个数字。我能够让它发挥作用,但我必须知道有多少字段。我试图弄清楚如何在一个更长的列表上执行此操作,我不想指定每个字段。
#!/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"
Run Code Online (Sandbox Code Playgroud)
这给了我输出:
keismbp13b:tmp$ ./ifs.sh list
1
2
3
4
5
keismbp13b:tmp$
Run Code Online (Sandbox Code Playgroud)
我想我可能必须使用 awk 或类似的东西来将列表分隔到换行符,但我很好奇是否有另一种方法。
谢谢!
发布后我也意识到我可以做到这一点
tr , "\n" < list
Run Code Online (Sandbox Code Playgroud)
无论如何要在不首先分离列表的情况下执行此操作?
αғs*_*нιη 11
正如您在问题中指出的那样,可以使用以下tr
命令完成:
tr ',' '\n' < infile
Run Code Online (Sandbox Code Playgroud)
这里有其他选项可以做到这一点。
sed -e $'s/,/\\\n/g' infile
Run Code Online (Sandbox Code Playgroud)
或者:
sed 's/,/\
/g' infile.txt
Run Code Online (Sandbox Code Playgroud)
或者在某些sed
实现中,使用:
sed 's/,/\n/g' infile
Run Code Online (Sandbox Code Playgroud)
或者通过awk
(如果你不介意最后一个空行):
awk -v RS=',' '1' infile
Run Code Online (Sandbox Code Playgroud)
或在bash
:
#!/bin/bash
while IFS='' read -r line; do
echo "${line//,/$'\n'}";
done < infile
Run Code Online (Sandbox Code Playgroud)
或读取数组,然后printf
:
#!/bin/bash
while IFS=, read -a fields; do
printf "%s\n" "${fields[@]}";
done < infile
Run Code Online (Sandbox Code Playgroud)
..., 2 4, ...
上面一样,否则,您可以将其添加到IFS
from IFS=','
toIFS=', '
以单独打印。 归档时间: |
|
查看次数: |
8920 次 |
最近记录: |