mai*_*ash 2 linux csv bash 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 ",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
.
.
.
.
Run Code Online (Sandbox Code Playgroud)
我的目标是在我的bash脚本中设置CSV参数(CSV中的所有状态)及其值
例如 (关于第二行值)
在我的bash脚本中,我将能够读取每个参数
例
echo $Alabama
1000
echo $Alaska
1 0 0 1
Run Code Online (Sandbox Code Playgroud)
首先,我只是尝试编写以下(错误的)代码,以便使用它们的值设置参数:
#!/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
Run Code Online (Sandbox Code Playgroud)
测试应该是(来自bash脚本)
echo $Alabama
1000
Run Code Online (Sandbox Code Playgroud)
我应该如何更改代码以实现我的想法?
解决问题的基本构建块:
#!/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
Run Code Online (Sandbox Code Playgroud)
根据您的输入文件,这会产生:
sh$ ./m.sh
Alabama
1000
100
10001
Run Code Online (Sandbox Code Playgroud)
编辑如果您只对第n行(存储在CSV_LINE)中感兴趣,您可以sed -n ...p输入文件(并使用if而不是while):
#!/bin/bash
# ...
# Set your CSV_LINE to the (file) line number you are looking for (here, line 2)
CSV_LINE=2
# ...
sed -n "${CSV_LINE}p" | if IFS="," read Alabama Alaska Arizona Arkansas California Colorado Connecticut Delaware Florida Georgia Hawaii Idaho Illinois Indiana Iowa
then
echo $Alabama
fi < my_file.csv
Run Code Online (Sandbox Code Playgroud)
请注意:由于管道是在子shell中执行的,因此各种变量仅绑定在if语句的主体内.
如果你不喜欢这个if构造,我刚刚学到了比使用你可能写的进程替换:
#!/bin/bash
# ...
# Set your CSV_LINE to the (file) line number you are looking for (here, line 2)
CSV_LINE=2
# ...
IFS="," read Alabama Alaska Arizona Arkansas California Colorado Connecticut Delaware Florida Georgia Hawaii Idaho Illinois Indiana Iowa \
< <(sed -n "${CSV_LINE}p" < my_file.csv)
echo $Alabama
Run Code Online (Sandbox Code Playgroud)
如果没有管道,则没有子shell - 因此在发出read内部命令后,可以从脚本中的任何位置访问该变量.