Bash
在不知道欄位數的情況下在換行符上列印 CSV 的每個欄位
我今天在玩 IFS,並創建了一個快速文本文件,其中包含在 1 行上用逗號分隔的數字列表。
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
有沒有辦法在不先分離列表的情況下做到這一點?
正如您在問題中指出的那樣,可以使用
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=','
toIFS=', '
以單獨列印。