awk / bash:重复向文件添加列

时间:2013-09-28 18:08:34

标签: bash awk gawk

我有一点数据操作问题,使用awkbash肯定可以解决。

我有两个现有的数据文件。 第一个由制表符分隔的字段组成,这些字段排列在n个块中。每个块由一个空行分隔。

1  3
2  4
3  5

4  6
5  7
6  8

第二个文件只有一列数据,与第一个文件中的每个块一样长。

a
b
c

我的问题是我必须将文件二中的数据列附加到文件一中的每个块,这样输出看起来像:

1  3  a
2  4  b
3  5  c

4  6  a
5  7  b
6  8  c
你知道吗?我已经尝试在新文件中将文件的数据写入n次(块数),并将其附加到awk,但我没有使其正常工作。

3 个答案:

答案 0 :(得分:2)

这个简单,动态的单行内衬可以解决问题:

awk 'NR==FNR{a[i++]=$0;next}{print (NF?$0 OFS a[j++%i]:$0)}' OFS='\t' file2 file1
1   3   a
2   4   b 
3   5   c

4   6   a
5   7   b
6   8   c

答案 1 :(得分:1)

将第二个文件的每一行保存在一个数组中,并使用模块运算符(%)循环其第一个文件的每一行的内容和数据:

awk '
    BEGIN { FS = OFS = "\t" } 
    FNR == NR { data[ NR - 1 ] = $0; next } 
    ! $0 { print; next } 
    { ++i; print $0, data[ (i - 1) % 3 ] }
' file2 file1

它产生:

1  3    a
2  4    b
3  5    c

4  6    a
5  7    b
6  8    c

答案 2 :(得分:0)

假设您有两个文件a.datb.dat,则可以执行此操作

cat -n a.dat > aa.dat
cat -n b.dat > bb.dat
join aa.dat bb.dat | awk '{$1=""}1' > c.dat
rm aa.dat bb.dat

您的结果会保存在c.dat中。 awk '{$1=""}1'删除第一列,即行号。