目的是检查file1中第3列和第4列的值是否与file2中第1列的值匹配。
如果有任何值匹配,请执行以下操作:
1)使用文件1第5列和第6列的信息替换文件2中第2列和第3列的值
2)用file1中第7列和第8列的值替换file2中的字符串($ 1,1,5)和字符串($ 1,6,5)
3)为替换的行添加字符R,为未替换的行添加字符。
文件1
2,100,31431,37131,999991.70,0000000.30,11111,22222,3
3,100,31431,37471,111113.20,1111111.30,22222,33333,4
文件2
3143137113 318512.50 2334387.50 100
3143137131 318737.50 2334387.50 100
3143137201 319612.50 2334387.50 100
3143137471 322987.50 2334387.50 100
3143137491 323237.50 2334387.50 100
所需的输出:
31431,37113,318512.50,2334387.50,100,O
11111,22222,999991.70,0000000.30,100,R
31431,37201,319612.50,2334387.50,100,O
22222,33333,111113.20,1111111.30,100,R
31431,37491,323237.50,2334387.50,100,O
我尝试过
awk '
BEGIN{
OFS=","
}
FNR==NR {
f1_56[$3$4]=($5 OFS $6)
f1_78[$3$4]=($7 OFS $8)
next
}
{$(NF+1)="O"}
$1 in f1_56 {
split(f1_56[$1], a, OFS)
$2 = a[1]
$3 = a[2]
split(f1_78[$1], a, OFS)
$1=a[1] OFS a[2]
$NF="R"
} 1
' FS=, file1 FS=' ' file2
预先感谢
答案 0 :(得分:2)
awk '
BEGIN{
OFS=","
}
FNR==NR {
f1_5[$3$4]=$5
f1_6[$3$4]=$6
f1_78[$3$4]=$7 OFS $8
next
}
$1 in f1_78{
$(NF+1)="R"
$2=f1_5[$1]
$3=f1_6[$1]
$1=f1_78[$1]
print
next
}
{
$(NF+1)="O"
$1=substr($1,1,5) OFS substr($1,6,5)
}
1 ' FS=, file1 FS=' ' file2
FS=,
,然后在BEGIN块中等于文件-F,
并等于FS=","
。
substr
用于子字符串。
您自己的代码需要花费过多的精力,合并然后再次拆分,不妨只使用一个变量来存储另一个字段。
不过,您的方向正确,进度很好。
尝试放慢速度,阅读manual,然后思考。您可以先下载它。
将相同的代码放在一行中:
awk 'BEGIN{OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, file1 FS=' ' file2
与以下相同:
awk 'BEGIN{FS=OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' file1 FS=' ' file2
也与:
awk -F, 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' OFS=, file1 FS=' ' file2
实际上与:
awk 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_5{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, OFS=, file1 FS=' ' file2
您会看到我们到处放置分隔符变量,有时使用-F
,有时在BEGIN
块中,有时在读取文件之前或之间,甚至混合使用,这是由于应答者的偏好和/或在某些情况下为简洁起见。