shell解析csv文件,将字段分配给变量并将其打印在多个列中

时间:2016-09-02 12:00:43

标签: linux bash shell csv parsing

我试图卷曲一个csv文件并根据它们的属性对其进行解析,然后使用变量名将其打印回来。

文件1:

10.0.0.1,gateway,name_of_device
10.2.4.5,server,name_of_device
10.3.5.6,PC,name_of_device

我的脚本,

#!/bin/sh

input=$(curl http://example.com/1.txt)

ip=$(echo "$input" | awk -F ',' '{print $1}')
type=$(echo "$input" | awk -F ',' '{print $2}')
name=$(echo "$input" | awk -F ',' '{print $3}')

echo "$ip $type $name" 

打印,

10.0.0.1
10.2.4.5
10.3.5.6
gateway
server
PC
name_of_device
name_of_device
name_of_device

但预期的输出应该是,

10.0.0.1 gateway name_of_device
10.2.4.5 server name_of_device
10.3.5.6 PC name_of_device

尝试了不同的选项,例如

将输出分配给另一个变量并回显它,

# output="$source_ip $tag_text"
# echo -e $output

printf语句:

# printf "%-20s | %-20s" "$source_ip" "$tag_text"


# printf "$source_ip" "$tag_text"

2 个答案:

答案 0 :(得分:2)

只需将输入字段分隔符设置为逗号,然后让awk处理其余内容:

$ awk -F, '$1=$1' file
10.0.0.1 gateway name_of_device
10.2.4.5 server name_of_device
10.3.5.6 PC name_of_device

通过说$1=$1awk重新计算字段并设置OFS四周,这使得所有逗号(FS)都替换为空格(OFS)。

答案 1 :(得分:1)

awk肯定是使用它的正确工具,但您也可以这样做:

curl http://example.com/1.txt |
while IFS=, read ip type name rest; do
  echo $ip $type $name
done

变量将在while循环结束后失去它们的值,因为它位于子shell中。