Bash中的CSV文件解析
我有一个CSV文件,下面给出了示例条目。我想要编写一个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
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/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执行某些操作
完成
对于大型文件来说,这一收益可能相当可观。这是一种更有效的方法,无需每次使用forkcut
:
#!/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=''
是的,比我的解决方案好得多。是的,比我的解决方案好得多。