如果我有一个脚本,它接受三个参数,如下所示:
./myScript.sh path file col1,col3
如果文件类似:
id,role,salary
05,engineer,45000
如何将$3拆分为单独的变量(注意,如果我有一个更大的CSV文件,这可以是任何数量的变量(,以便只将相应的列打印到$3。
我已经尝试将$3保存到一个变量中,使用Tr和数组可以将数组的索引与列标题编号相等。我没能做到这一点。解决这个问题最简单的业余方法是什么?如果脚本将列作为单独的参数,这将是直接的,但当组合在一个参数中时,这对我来说相当复杂。
预期输出:
id,salary
05,45000
如果列的顺序必须保持不变:
#!/bin/bash
path="$1"
fname="$2"
cols="$3"
header=($(head -1 "$fname" | sed 's/,/ /g'))
for i in "${!header[@]}"; do
cols=$(echo "$cols" | sed "s/${header[$i]}/$((i+1))/g")
done
cut -d',' -f$cols $fname
如果您需要更大的灵活性,例如定义列的顺序,只需更改脚本的最后部分:
for i in "${!header[@]}"; do
cols=$(echo "$cols" | sed -e "s/${header[$i]}/$$((i+1))/g")
done
awk -F, "{print(${cols//,/","})}" $fname
输出:
$ ./so.sh <path> input.txt id,salary
id,salary
05,45000
使用awk
方法,您可以执行类似的操作
$ ./so.sh <path> input.txt id,salary,id,salary
id,salary,id,salary
05,45000,05,45000