bash - 使用 AWK 从多个文件向 csv 表添加列

标签 bash awk

我希望通过使用 AWK 从多个文件中获取值来构建一个 csv 表。我让它处理两个文件,但我无法扩展它。我目前正在获取第二个文件的输出,并附加第三个文件,依此类推。

这里是示例文件:

#file1  #file2  #file3  #file4
100     45      1       5
200     23      1       2
300     29      2       1
400     0       1       2
500     74      4       5

这是目标:

#data.csv
1,100,45,1,5
2,200,23,1,2
3,300,29,2,1
4,400,0,1,2
5,500,74,4,5

这就是我的工作:

awk 'FNR==NR { a[FNR""] = NR", " $0","; next } { print a[FNR""], $0}' $file1 $file2

结果:

1, 100, 45
2, 200, 23
3, 300, 29
4, 400, 0
5, 500, 74

但是当我尝试让它处理 3 个或更多文件时,就像这样:

awk 'FNR==NR { a[FNR""] = NR", " $0","; next } { print a[FNR""], $0; next } { print a[FNR""], $0}' $file1 $file2 $file3

我得到这个输出:

1, 100, 45
2, 200, 23
3, 300, 29
4, 400, 0
5, 500, 74
1, 100, 1 
2, 200, 1 
3, 300, 2
4, 400, 1
5, 500, 4

在第一列中行数重新开始,第二列它也重复第一个文件。在第三列中,它将第三个和后续文件添加为新行,我希望这些文件应该添加为列。不需要新行。

如有任何帮助,我们将不胜感激。我从 Stack Exchange 中学到了我的大部分 AWK,而且我知道我在这里遗漏了一些基本的东西。谢谢,

最佳答案

如前所述,您可以使用粘贴。要使用逗号分隔的行编号获得准确的输出,您可以这样做

paste -d, file{1..4} | nl -s, -w1
  • -s, 设置数字分隔符为逗号(默认为制表符)。
  • -w1 设置数字宽度,所以没有初始空格(因为默认更大)

awk 的另一种解决方案

awk    '{a[FNR]=a[FNR] "," $0} 
    END {for (i=1;i<=length(a);i++) print i a[i]}' file{1..4}

关于bash - 使用 AWK 从多个文件向 csv 表添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47398668/

相关文章:

regex - 选择括号之间的逗号分隔值

linux - 如何使用 AWK 从 nginx 访问日志中收集 IP 和用户代理信息并确定它们的基本 IP 地址?

bash - 从 shell 脚本增量部署

bash - 如何获取当前shell脚本的完整路径名?

file - 打印文件的所有行以及其他文件中的匹配行

linux - 在 HTML 代码中查找并复制字符串

linux - Shell 脚本变量值未更新

string - bash shell脚本将字符串与句点字符连接起来

linux + 将 sh 脚本转换为 bash + bash 是否支持以前的 sh 脚本

linux - AWK 对 2 列的值求和并附加到记录