1

我有一个小数据操作问题,当然可以通过使用awkor来解决bash

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

1  3
2  4
3  5

4  6
5  7
6  8

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

a
b
c

我的问题是我必须将文件 2 中的数据列附加到文件 1 中的每个块,以便输出如下所示:

1  3  a
2  4  b
3  5  c

4  6  a
5  7  b
6  8  c

你有什么主意吗?我已经尝试在一个新文件中写入文件的数据两次(块数)并附加它,awk但我没有让它正常工作。

4

3 回答 3

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
于 2013-09-28T22:18:12.663 回答
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
于 2013-09-28T18:16:22.647 回答
0

假设你有两个文件, a.dat, b.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'删除作为行号的第一列。

于 2013-09-28T18:18:58.010 回答