我有两个共同字段的文件。我想将这两个文件与common字段合并,并使用linux命令中的awk
将合并后的文件写入另一个文件。
文件1
412234$name1$value1$mark1
413233$raja$$mark2
414444$$$
file2的
412234$sum$file2$address$street
413233$sum2$file32$address2$street2$path
414444$$$$
这些示例文件由$
分隔,输出合并文件也在$
。这些行也有空字段。
我使用join
尝试了脚本:
join -t "$" out2.csv out1.csv |sort -un > file3.csv
但是总数不匹配发生了。
尝试awk
:
myawk.awk
#!/usr/bin/awk -f
NR==FNR{a[FNR]=$0;next} {print a[FNR],$2,$3}
我跑了
awk -f myawk.awk out2.csv out1.csv > file3.csv
这也花了太多时间。没有回复。
此处out2.csv
是主文件,我们必须与out1.csv
你能帮我把合并后的文件写进另一个文件吗?
答案 0 :(得分:3)
使用bash
运行以下命令。这相当于一个完整的外连接
join -t'$' -a 1 -a 2 <(sort -k1,1 -t'$' out1.csv ) <(sort -k1,1 -t'$' out2.csv )
答案 1 :(得分:1)
您使用awk
解决方案的方向很好。重点是将FS
更改为使用$
分割字段:
script.awk
的内容:
awk '
BEGIN {
## Split fields with "$".
FS = "$"
}
## Save lines from second file, the first field as the index of the
## array, and rest of the line as the value.
FNR == NR {
file2[ $1 ] = substr( $0, index( $0, "$" ) )
next
}
## Print when keys from both files match.
FNR < NR {
if ( $1 in file2 ) {
printf "%s$%s\n", $0, file2[ $1 ]
}
}
' out2.csv out1.csv
输出:
412234$name1$value1$mark1$$sum$file2$address$street
413233$raja$$mark2$$sum2$file32$address2$street2$path
414444$$$$$$$$