7

我有一个包含 41 列的 CSV 文件(usvd.csv),我的 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 列中,我只想打印上面列出的列,它们可能因文件而异。

谢谢!!

4

2 回答 2

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成片段,因此 a[1]=field1, a[2]=field2, ...
  • {for (i in a) printf "%s ", $(a[i]); printf "\n"}'循环和打印。
于 2013-10-24T11:59:51.080 回答
4

您可以使用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
于 2013-10-24T11:56:35.983 回答