【问题标题】:shell parse csv file, assign fields to variable and print it in multiple columnsshell解析csv文件,将字段分配给变量并在多列中打印
【发布时间】:2017-01-10 13:01:57
【问题描述】:

我正在尝试卷曲一个 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"

【问题讨论】:

    标签: linux bash shell csv parsing


    【解决方案1】:

    awk 无疑是用于此目的的正确工具,但您也可以这样做:

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

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

    【讨论】:

    • ... 如果您想在主 shell 中使用变量,请使用带有while ... done < <(curl ...)的进程替换
    【解决方案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 重建记录并实际使用 OFS
    • 是的,这行得通。但是我如何解析为行?如果我调用 IP(第一列),它应该提供适当的类型和名称(即第二和第三列)。
    • @Karthik 您如何“调用 IP”?也许使用grep检索指定IP的线路是你想要的?
    • @Aaron 可能是的。
    • @fedorqui 是的,明白。我的最终目标是将这些数据推送到某些数据库中以用于其他目的。我真的还没有开始研究数据库导入,现在在这里发布这个问题还为时过早。所以数据库将包含一组定义的列,这就是为什么我必须在这个脚本本身中忽略它们。你的建议很有帮助。谢谢
    猜你喜欢
    • 2015-04-11
    • 2011-05-21
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多