awk:将多个 CSV 文件中的列追加到单个 CSV 文件中

  • 本文关键字:CSV 文件 追加 单个 awk 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(?我正在考虑将文件名存储到一个数组中,插入一个标题行,然后打印数组,但我无法弄清楚语法。

因此,基于一些假设:

  • 输入称为"*.csv",但它们实际上是空格分隔的,因为它们看起来。
  • 奇数输入列只需重复行号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}'

相关内容

  • 没有找到相关文章

最新更新