我有基本文件和基于基本文件的第1个字段的具有公共数据的多个文件。我需要输出文件与所有数据的组合。我尝试了很多命令,因为文件大小花了很多时间输出很多次awk帮助我,但我不知道awk数组编程 示例
基本文件
aa
ab
ac
ad
ae
文件-1
aa,Apple
ab,Orange
ac,Mango
文件-2
aa,1
ab,2
ae,3
预期输出文件
aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3
这就是我的尝试:
awk -F, 'FNR==NR{a[$1]=$0;next}{if(b=a[$1]) print b,$2; else print $1 }' OFS=, test.txt test2.txt
答案 0 :(得分:1)
您可以尝试连续2次join
。类似以下功能的东西应该有效:
join -a 1 -t, -e '' -o auto <(join -a 1 -t, -e '' -o auto base_file file1) file2
在此,我们先加入base_file
和file1
,然后将结果与file2
一起加入。
说明:
join -a 1 -t, -e '' -o auto base_file file1
:
-a 1
:即使base_file
file1
的字段
-t,
:我们将字符,
视为字段分隔符。这会影响输入文件和函数输出。-e '' -o auto
:当字段不存在时,输出字符串''
。 -e
选项取决于-o
选项。 -o auto
是默认输出格式。输出
aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3
答案 1 :(得分:1)
awk方式:
awk -F, -v OFS="," 'NR==FNR{a[$1]=$2}FILENAME==ARGV[2]{b[$1]=$2}
FILENAME==ARGV[3]{print $0,a[$0],b[$0]}' f1 f2 base
答案 2 :(得分:1)
这适用于任何数量的输入文件的任何awk:
$ cat tst.awk
BEGIN { FS=OFS="," }
!seen[$1]++ { keys[++numKeys] = $1 }
FNR==1 { ++numFiles }
{ a[$1,numFiles]=$2 }
END {
for (keyNr=1; keyNr <= numKeys; keyNr++) {
key = keys[keyNr]
printf "%s%s", key, OFS
for (fileNr=2;fileNr<=numFiles;fileNr++) {
printf "%s%s", a[key,fileNr], (fileNr<numFiles ? OFS : ORS)
}
}
}
$ awk -f tst.awk base file1 file2
aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3