我的第一个文件test1.csv用管道分隔,并且始终有一个选项卡:
ug|s|B|city|bg1|1|8D|ON-05|100 10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150 11|28|288
ug|s|B|city|bg2|2|94|ON-05|350 12|28|288
我只有一个选项卡有第二个文件test2.csv:
bg1 250
bg2 350
我想使用第一个文件(bg1,bg2)中的第5列加入它们,因此我可以从第二个文件(250,350)中获取值
因此最终输出应为:
ug|s|B|city|bg1|1|8D|ON-05|100|250 10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150|250 11|28|288
ug|s|B|city|bg2|2|94|ON-05|350|350 12|28|288
我尝试使用AWK加入他们:
awk -F '|' -v OFS='|' '
FNR==NR { } {
split($NF, b, "\t")
$NF = b[1] FS a[b[1]] "\t" b[2]
} 1' test2.csv test1.csv > final.csv
但没有得到正确的结果
答案 0 :(得分:2)
awk '
BEGIN { FS=OFS="\t"; subFs="|" }
NR==FNR { map[$1]=$2; next }
{ split($1,subFlds,subFs); print $1 subFs map[subFlds[5]], $2 }
' test2.csv test1.csv
ug|s|B|city|bg1|1|8D|ON-05|100|250 10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150|250 11|28|288
ug|s|B|city|bg2|2|94|ON-05|350|350 12|28|288
答案 1 :(得分:1)
对于我的一般命题,这是一个完美的用例,应该避免使用-v
来支持在命令行上直接分配。您可以轻松地在文件之间切换FS并执行以下操作:
$ awk 'NR==FNR{f[$1]=$2; next} {print $0, f[$5]}' test2.csv FS=\| OFS=\| test1.csv
ug|s|B|city|bg1|1|8D|ON-05|100 10|28|288|250
ug|s|B|city|bg1|1|D9|ON-05|150 11|28|288|250
ug|s|B|city|bg2|2|94|ON-05|350 12|28|288|350
这并不能完全提供您想要的输出,但这很容易修复,尽管有点尴尬:
awk 'NR==FNR{f[$1]=$2; next} {split($9,a,"\t"); \
$9=a[1] "|" f[$5] "\t" a[2]}1' test2.csv FS=\| OFS=\| test1.csv
答案 2 :(得分:0)
您也可以使用Perl进行此操作。
$ cat test2.csv
bg1 250
bg2 350
$ cat test1.csv
ug|s|B|city|bg1|1|8D|ON-05|100 10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150 11|28|288
ug|s|B|city|bg2|2|94|ON-05|350 12|28|288
$ perl -F'\t' -lane 'if($ARGV eq "test2.csv") { $kv{$F[0]}=$F[1]}; if( $ARGV eq "test1.csv" ) { ($x,$y)=(split(/\|/,$F[0]))[4,8]; if($kv{$x}) {$F[0]=~s/$y$/$kv{$x}/g } pr
int "$F[0]\t$F[1]" } ' test2.csv test1.csv
ug|s|B|city|bg1|1|8D|ON-05|250 10|28|288
ug|s|B|city|bg1|1|D9|ON-05|250 11|28|288
ug|s|B|city|bg2|2|94|ON-05|350 12|28|288
$