Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中的CSV文件解析_Bash_Csv - Fatal编程技术网

Bash中的CSV文件解析

Bash中的CSV文件解析,bash,csv,Bash,Csv,我有一个CSV文件,下面给出了示例条目。我想要编写一个Bash脚本,逐行读取CSV文件,并将第一个条目(例如005)放入一个变量中,将IP192.168.10.1放入另一个变量中,我需要将其传递给其他脚本 005,192.168.10.1 006,192.168.10.109 007,192.168.10.12 008,192.168.10.121 009,192.168.10.123 如果这是一个非常简单的csv文件,没有字符串文本等。您可以简单地使用head和cut: #!/bin/bas

我有一个CSV文件,下面给出了示例条目。我想要编写一个Bash脚本,逐行读取CSV文件,并将第一个条目(例如
005
)放入一个变量中,将IP
192.168.10.1
放入另一个变量中,我需要将其传递给其他脚本

005,192.168.10.1
006,192.168.10.109
007,192.168.10.12
008,192.168.10.121
009,192.168.10.123

如果这是一个非常简单的csv文件,没有字符串文本等。您可以简单地使用
head
cut

#!/bin/bash

while read line
do
    id_field=$(cut -d',' -f 1 <<<"$line") #here 005 for the first line
    ip_field=$(cut -d',' -f 2 <<<"$line") #here 192.168.0.1 for the first line
    #do something with $id_field and $ip_field
done < file.csv
#/bin/bash
读行时
做

id_field=$(cut-d','-f1如果这是一个非常简单的csv文件,没有字符串文本等。您可以简单地使用
head
cut

#!/bin/bash

while read line
do
    id_field=$(cut -d',' -f 1 <<<"$line") #here 005 for the first line
    ip_field=$(cut -d',' -f 2 <<<"$line") #here 192.168.0.1 for the first line
    #do something with $id_field and $ip_field
done < file.csv
!/bin/bash
读行时
做

id_field=$(cut-d','-f1下面是我如何使用GNU工具实现它:

while read line; do
    echo $line | cut -d, -f1-2 --output-delimiter=' ' | xargs your_command
done < your_input.csv
读取行时;执行以下操作
echo$line | cut-d,-f1-2--输出分隔符=“”| xargs您的_命令
完成
在行读取时;do[…];done
将逐行读取文件。
对于每一行,我们将
剪切到它的前两个字段(因为它是CSV,所以用逗号分隔),并将它们以空格分隔的方式传递给
xargs
,然后将它们作为参数传递给
您的_命令

,下面是我使用GNU工具的方法:

while read line; do
    echo $line | cut -d, -f1-2 --output-delimiter=' ' | xargs your_command
done < your_input.csv
读取行时;执行以下操作
echo$line | cut-d,-f1-2--输出分隔符=“”| xargs您的_命令
完成
在行读取时;do[…];done
将逐行读取文件。
对于每一行,我们将
剪切到它的前两个字段(因为它是CSV,所以用逗号分隔),并将它们以空格分隔的方式传递到
xargs
,而xargs将作为参数传递给
您的_命令

这是一种更有效的方法,无需每次分叉
剪切

#!/usr/bin/env bash

while IFS=, read -r field1 field2; do
    # do something with $field1 and $field2
done < file.csv
!/usr/bin/env bash
当IFS=时,读取-r字段1字段2;do
#使用$field1和$field2执行某些操作
完成

对于大型文件来说,这一收益可能相当可观。

这是一种更有效的方法,无需每次使用fork
cut

#!/usr/bin/env bash

while IFS=, read -r field1 field2; do
    # do something with $field1 and $field2
done < file.csv
!/usr/bin/env bash
当IFS=时,读取-r字段1字段2;do
#使用$field1和$field2执行某些操作
完成


对于大型文件来说,收益可能相当可观。

文件是基本csv,还是您计划使用高级字符串文字?这里有问题吗?我没有看到。到底是什么问题?文件是基本csv,还是您计划使用高级字符串文字?这里有问题吗?我没有看到问题。到底是什么问题?如何运行脚本是循环的,用于对CSV中的每一行执行上述操作。因为有超过一百行我想要执行相同的操作above@Robin:啊,不知怎的,我错过了你想对每一行执行此操作的机会,我以为你只想处理第一行。请参见编辑。这效率太低了。@chepner:是的,通常你不写bash scripts用于光线跟踪(我知道这是有人做的),也不用于对subsum问题进行动态规划。我们讨论的是必须处理的100行…为了性能,使用a(静态)具有强大编译器优化功能的类型化编译语言。如何运行此脚本是循环的,以便对CSV中的每一行执行上述操作。因为我要执行的操作有上百行above@Robin:啊,不知怎的,我错过了你想对每一行执行此操作的机会,我假设你只想处理第一行。请参阅编辑。这是效率太低了。@chepner:是的,通常你不会为光线跟踪编写bash脚本(我知道这是有人做的),也不会对subsum问题进行动态编程。我们讨论的是必须处理的100行代码……为了性能,你会使用一个(静态的)具有强大编译器优化功能的类型化编译语言。这不会切掉逗号,因此命令会将这两个字段解释为一个参数。@WillemVanOnsem对,我应该用逗号而不是空格来测试它。您认为使用
--output delimiter='
足以解决此问题吗?看起来是这样的使用
--output delimiter='
效果很好。这不会切掉逗号,因此命令会将这两个字段解释为一个参数。@WillemVanOnsem对,我应该用逗号而不是空格来测试它。你认为使用
--output delimiter='
就足以解决这个问题吗?看起来它可以在用
--output delimiter=''
是的,比我的解决方案好得多。是的,比我的解决方案好得多。