awk:将多个csv文件中的列附加到单个csv文件中

时间:2017-05-24 04:55:53

标签: csv awk

我有几个CSV文件(所有行和列的数量都相同)。每个文件都遵循以下格式:

1    100.23  1    102.03  1    87.65
2    300.56  2    131.43  2    291.32
.    .       .    .       .    . 
.    .       .    .       .    .
200  213.21  200  121.81  200  500.21

我需要提取第2,4和6列,并将它们添加到单个CSV文件中。 我的shell脚本中有一个循环,它遍历所有CSV文件,提取列,并将这些列附加到单个文件中:

#output header column
awk -F"," 'BEGIN {OFS=","}{ print $1; }' "$input" > $output

for f in "$1"*.csv; 
do
   if [[ -f "$f" ]] #removes symlinks (only executes on files with .csv extension)
   then
       fname=$(basename $f)
       arr+=("$fname") #array to store filenames
       paste -d',' $output <(awk -F',' '{ print $2","$4","$6; }' "$f") > temp.csv
       mv temp.csv "$output"
   fi
done

运行它会产生此输出:

1    100.23  102.03  87.65   219.42  451.45  903.1   ... 542.12  321.56  209.2
2    300.56  131.43  291.32  89.57   897.21  234.52      125.21  902.25  254.12
.    .       .       .       .       .       .           .       .       .    
.    .       .       .       .       .       .           .       .       .
200  213.23  121.81  500.21  231.56  5023.1  451.09  ... 121.09  234.45  709.1

我想要的输出是一个CSV文件,如下所示:

     1.csv   1.csv   1.csv   2.csv   2.csv   2.csv   ...  700.csv  700.csv  700.csv
1    100.23  102.03  87.65   219.42  451.45  903.1        542.12   321.56   209.2
2    300.56  131.43  291.32  89.57   897.21  234.52       125.21   902.25   254.12
.    .       .       .       .       .       .            .        .        .       
.    .       .       .       .       .       .            .        .        .
200  213.23  121.81  500.21  231.56  5023.1  451.09  ...  121.09   234.45   709.1

换句话说,我需要一个包含文件名的标题行,以便识别从中提取列的文件。我无法理解如何做到这一点。

实现这一目标的最简单方法是什么(最好使用awk)? 我在考虑将文件名存储到数组中,插入标题行然后打印数组,但我无法弄清楚语法。

1 个答案:

答案 0 :(得分:0)

所以,基于一些假设:

  • 输入被称为&#34; * .csv&#34;但是它们实际上是空格分开的。
  • 奇数输入列只重复行号3次,可以忽略
  • 列标题只是文件名,每次重复3次
  • 它们被输入到其他一些程序中,无论如何这些数字都是左对齐的,因此您对列格式(排列的列,小数对齐,......)并不特别。

谦虚的道歉,因为代码PRE格式化对我不起作用

f=$(set -- *.csv; echo $*)

(echo $f; paste $f) |

awk 'NR==1 { for (i=1; i<=NF; i++) {x=x" "$i" "$i" "$i} }

NR > 1 { x=$1; for (i=2; i<= NF; i+=2) {x=x" "$i} }

{print x}'

HTH