将数组传递给awk,其中包含需要打印的列号

时间:2013-10-24 11:47:10

标签: arrays bash shell awk

我有一个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列中,我只想打印上面列出的列,它们可能因文件而异。

谢谢!

2 个答案:

答案 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