Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
Linux 将CSV值导入Bash_Linux_Bash_Csv_Awk_Sed - Fatal编程技术网

Linux 将CSV值导入Bash

Linux 将CSV值导入Bash,linux,bash,csv,awk,sed,Linux,Bash,Csv,Awk,Sed,我有以下CSV文件: more my_file.csv Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,Florida,Georgia,Hawaii,Idaho,Illinois,Indiana,Iowa 1000,"1 0 0 1",1002,1002,1003,1004,1005,"1 0 0 6",1007,1008,1009,1010,1011,1012,1013 100," 1 0 1 "

我有以下CSV文件:

more my_file.csv
Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,Florida,Georgia,Hawaii,Idaho,Illinois,Indiana,Iowa
1000,"1 0 0 1",1002,1002,1003,1004,1005,"1 0 0 6",1007,1008,1009,1010,1011,1012,1013
100," 1 0 1 ",102,102,103,104,105,"1 0 6 2",107,108,109,"1 1 0 3 5 62 0",111,112,113
10001,10011,10021,10021,10031,10041,10051,10061,10071,10081,10091,10101,10111,10121,10131
.
.
.
.
我的目标是在bash脚本中设置CSV参数(CSV中的所有状态)及其值

echo $Alabama
1000
例如(关于第二行值)

在我的bash脚本中,我将能够读取每个参数

范例

 echo $Alabama
 1000 
 echo $Alaska
 1 0 0 1
首先,我尝试编写以下(错误的)代码,以便使用参数值设置参数:

#!/bin/bash

counter=1

for CSV_COLUMN in Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
do
  export $CSV_COLUMN=` echo $CSV_LINE | cut -d',' -f$counter `
  counter=$counter+1
done
测试应该是(来自bash脚本)


我应该如何更改代码以实现我的想法?

基本构建块来解决您的问题:

#!/bin/bash

while IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
do
    echo $Alabama
done < my_file.csv

编辑如果您只对第n行感兴趣(存储在
CSV\u行
),您可以
sed-n…p
您的输入文件(并使用
If
而不是
while
):


没有管道就没有子shell——因此在发出
read
内部命令后,可以从脚本中的任何位置访问变量。

Bash可以使用如下模式处理类似您的CSV文件(有一些限制,下面有更多限制)(假设您使用CSV文件作为标准输入运行脚本),自动将第一行中的字段名用作变量名:

# Get the field names from the first line
IFS=, read fields

# Define command to read all fields from a line
fieldsreader="IFS=, read ${fields//,/ }"

# Look over all records
while eval $fieldsreader; do
    ## This is run once per data line
    ## with access to $fieldname for all fields.
done
因此,您的示例可以编码为

IFS=, read fields
fieldsreader="IFS=, read ${fields//,/ }"
while eval $fieldsreader; do
    echo $Alabama
done
哪个会打印

1000
100
10001
...

但是,请注意,以这种方式使用bash的read命令和IFS=,并不能正确解析CSV文件:bash仅识别CSV文件中常见的\-quoting,而不是\-quoting(例如,根据授权).

CSV是一种表格格式。为什么
echo$Alabama
只显示第一行的字段值?在我的例子中-->每个参数(CSV中的第一行)都有一个值(值也可以介于“……”之间)为什么要使用csv文件中的每个列值创建单独的shell变量。awk不是更适合处理csv文件吗?我持开放的态度,如果awk可以做得更好,请告诉我们?awk应该在bash scipt中(作为awk一行)可以这样做吗:done@maihabunah我不太清楚什么是
$CSV\u行
。但无论如何,您当然可以从脚本内部重定向。假设它包含您的CSV文件名,类似于
…done<“$CSV\u行“
。正如我所说,这些只是基本的组成部分。你现在应该可以自己进步了。如果你无意中遇到其他问题,请随意问其他问题!CSV_行是CSV文件中的一行(可以是第二行或三行等)@Maihabunah进行了相应修改。是否可以从CSV中重定向$LINE?已完成<“1002 222 333 223 435 45 46 4656”
# Get the field names from the first line
IFS=, read fields

# Define command to read all fields from a line
fieldsreader="IFS=, read ${fields//,/ }"

# Look over all records
while eval $fieldsreader; do
    ## This is run once per data line
    ## with access to $fieldname for all fields.
done
IFS=, read fields
fieldsreader="IFS=, read ${fields//,/ }"
while eval $fieldsreader; do
    echo $Alabama
done
1000
100
10001
...