Bash

在不知道欄位數的情況下在換行符上列印 CSV 的每個欄位

  • August 18, 2017

我今天在玩 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, ...,如上所示,否則,您可以將其添加到IFSfrom IFS=','toIFS=', '以單獨列印。

引用自:https://unix.stackexchange.com/questions/386840