【发布时间】:2019-02-21 09:04:32
【问题描述】:
目的是检查 file1 中第 3 列和第 4 列的值是否与 file2 中的第 1 列匹配。 如果任何值匹配,则使用 file1 第 5 列和第 6 列的信息替换 file2 中第 2 列和第 3 列的值
另外,我需要将 file1 中的第 7 列和第 8 列的值添加到第 1 列和第 2 列中的 file2 中,用于匹配行,字符 R 用于替换行,O 用于未替换行,
文件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
我试过这两个:
1)
awk '
BEGIN{
OFS=","
}
FNR==NR{
a[$3 $4]=$3 OFS $4
b[$3 $4]=$5
c[$3 $4]=$6
d[$3 $4]=$7 OFS $8
next
}
($1 in
a){
$4=d[$1]
$3=c[$1]
$2=b[$1]
$1=a[$1]
print
next
}
{
$1=$1
sub(/^...../,"&,",$1)
print
}
' FS="," file1 FS=" " file2
输出
31431,37113,318512.50,2334387.50,100
31431,37131,999991.70,0000000.30,11111,22222
31431,37201,319612.50,2334387.50,100
31431,37471,111113.20,1111111.30,22222,33333
31431,37491,323237.50,2334387.50,100
2)
awk -F, 'NR==FNR{a[$3 $4]=substr($0,length($3 FS)+1);next} $1 in a{print a[$1],$NF;next} {$1=substr($1,1,5) OFS substr($1,6,5);} 1' OFS=, file1 FS=' ' file2
输出
31431,37113,318512.50,2334387.50,100
31431,37131,999991.70,0000000.30,11111,22222,3,100
31431,37201,319612.50,2334387.50,100
31431,37471,111113.20,1111111.30,22222,33333,4,100
31431,37491,323237.50,2334387.50,100
两者都有效,但不完全。
提前致谢
【问题讨论】:
-
Perl 解决方案适合您吗?
-
@OXXO,请不要频繁更改您的要求,这是我不得不更改代码的第三次或第四次(在您的问题更改后)。它会让人们认为我们的代码不起作用,甚至可能会感到困惑。只需提供 3 样东西。第一个-您的输入样本,第二个-您的预期输出样本和第三个-您尝试过的(您已经给出的)。要求您不要频繁更改问题。
标签: awk