使用AWK从多个文件向CSV表添加列

Cam*_*her 2 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
Run Code Online (Sandbox Code Playgroud)

这是目标:

#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
Run Code Online (Sandbox Code Playgroud)

这是我的工作:

awk 'FNR==NR { a[FNR""] = NR", " $0","; next } { print a[FNR""], $0}' $file1 $file2
Run Code Online (Sandbox Code Playgroud)

结果:

1, 100, 45
2, 200, 23
3, 300, 29
4, 400, 0
5, 500, 74
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使其在3个或更多文件上运行时,如下所示:

awk 'FNR==NR { a[FNR""] = NR", " $0","; next } { print a[FNR""], $0; next } { print a[FNR""], $0}' $file1 $file2 $file3
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

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
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激。我已经从Stack Exchange学习了大部分的AWK,而且我知道这里缺少一些基本知识。谢谢,

tha*_*isp 5

如已经回答的,您可以使用paste。要获得以逗号分隔的行号的确切输出,您可以执行此操作

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

另一个解决方案 awk

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

  • 关于“ {1..4}”和“ [1-4]”之间区别的一个注释;前者将抱怨是否缺少任何文件,后者将处理存在的任何文件。 (2认同)