使用来自多个文件的AWK将列添加到csv表

时间:2017-11-20 18:21:33

标签: 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,我知道我在这里缺少一些基本的东西。谢谢,

4 个答案:

答案 0 :(得分:5)

如前所述,您可以使用paste。要使用逗号分隔的行编号获得准确的输出,您可以执行此操作

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}

答案 1 :(得分:1)

针对可变数量文件的[Name] NVARCHAR (MAX) NULL, ... [Venue] NVARCHAR (MAX) NULL, [Artist_Id] NVARCHAR (128) NULL, 解决方案:

awk

例如:

awk '{ !line[FNR] && line[FNR]=FNR; line[FNR]=line[FNR]","$0 }
     END { for (i=1; i<=length(line); i++) print line[i] }' file1 file2 ... fileN

答案 2 :(得分:0)

为什么不使用粘贴,然后只为每一行编号: -

paste -d"," file1 file2 file3 file4
100,45,1,5
200,23,1,2
300,29,2,1
400,0 ,1,2
500,74,4,5

答案 3 :(得分:0)

这是一个初学友好的解决方案。如果您需要在途中操作数据,则可以清楚地看到正在读取的文件 ARGIND具体gawk。它告诉我们正在处理哪个文件。我们从ab填充两个数组file1file2,然后在处理file3时打印所需的输出。

awk '
ARGIND == 1 { a[FNR] = $0 ; next }
ARGIND == 2 { b[FNR] = $0 ; next }
ARGIND == 3 { print FNR "," a[FNR] "," b[FNR] "," $0 }
' file1 file2 file3

输出:

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