我有一个CSV文件( usvd.csv ),其中包含41列,我的bash脚本处理标题行到锻造要打印的列,结果是我需要打印41个中的26个列。这些可能会有所不同 - CSV中的列数和/或需要打印的列数。
包含需要打印的列数的数组如下:
${UNIQUE[@]} = 1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 26 30 35 37 39 40 41
因此,在41列中,我只想打印上面列出的列,它们可能因文件而异。
谢谢!
答案 0 :(得分:6)
我喜欢@ devnull的解决方案,但为了完整起见,我会建议awk
版本:
$ list=$(echo "${UNIQUE[@]}")
$ awk -vd="$list" 'BEGIN{split(d, a, " ")} {for (i in a) printf "%s ", $(a[i]); printf "\n"}' file
col3 col4 col7
col3 col4 col7
col3 col4 col7
对于给定的文件
col1 col2 col3 col4 col5 col6 col7
col1 col2 col3 col4 col5 col6 col7
col1 col2 col3 col4 col5 col6 col7
list=$(echo "${UNIQUE[@]}")
将数组转换为具有空格分隔字段的字符串。-vd="$list"
将bash变量$list
传递给awk以用作d
。BEGIN{split(d, a, " ")}
按空格分割d
字符串,以便[1] = field1,a [2] = field2,... {for (i in a) printf "%s ", $(a[i]); printf "\n"}'
循环和打印。答案 1 :(得分:3)
您可以使用cut
。请考虑以下示例:
UNIQUE=(1 2 4 6) # Array containing columns to be printed
fields=$( IFS=, echo "${UNIQUE[@]}") # Get the fields in comma-delimited form
# seq -s, 10 would print the string: 1,2,3,4,5,6,7,8,9,10
seq -s, 10 | cut -d, -f"${fields[@]}" # Print the desired fields
这会导致
1,2,4,6