打印 CSV 文件中的第 n 列,其中 myScript.sh 读取表,列参数组合如下:"col1,col2,col3"在一个参数中



如果我有一个脚本,它接受三个参数,如下所示:

./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

最新更新