我有一点数据操作问题,使用awk
或bash
肯定可以解决。
我有两个现有的数据文件。 第一个由制表符分隔的字段组成,这些字段排列在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
,但我没有使其正常工作。
答案 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.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'
删除第一列,即行号。