我有几个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}'
呵