Awk 匹配两个文件中的值并替换选定列中的值
其目的是检查file1中第3列和第4列的值是否与file2中的第1列匹配。 如果有任何值匹配,则使用file1第5列和第6列的信息替换file2中第2列和第3列的值 另外,我需要将file1中第7列和第8列的值添加到file2中的第1列和第2列中,用于匹配的行,字符R用于替换的行,字符O用于未替换的行 文件1 文件2 期望输出: 我试过这两个: 一, 输出 二, 输出 这两种方法都有效,但并不完全有效Awk 匹配两个文件中的值并替换选定列中的值,awk,Awk,其目的是检查file1中第3列和第4列的值是否与file2中的第1列匹配。 如果有任何值匹配,则使用file1第5列和第6列的信息替换file2中第2列和第3列的值 另外,我需要将file1中第7列和第8列的值添加到file2中的第1列和第2列中,用于匹配的行,字符R用于替换的行,字符O用于未替换的行 文件1 文件2 期望输出: 我试过这两个: 一, 输出 二, 输出 这两种方法都有效,但并不完全有效 提前感谢请尝试以下内容 awk ' FNR==NR{ a[$3 $4]=$7 $8 b
提前感谢请尝试以下内容
awk '
FNR==NR{
a[$3 $4]=$7 $8
b[$3 $4]=$5
c[$3 $4]=$6
next
}
($1 in a){
$2=b[$1]
$3=c[$1]
$1=a[$1]
found=1
}
{
$0=found==1?$0",R":$0",O"
sub(/^...../,"&,")
$1=$1
found=""
}
1
' FS="," file1 FS=" " OFS="," file2
输出如下
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 '
FNR==NR{
a[$3 $4]=$7 $8
b[$3 $4]=$5
c[$3 $4]=$6
next
}
($1 in a){
$2=b[$1]
$3=c[$1]
$1=a[$1]
found=1
}
{
$0=found==1?$0",R":$0",O"
sub(/^...../,"&,")
$1=$1
found=""
}
1
' FS="," file1 FS=" " OFS="," file2
输出如下
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
Perl版本:
!/usr/bin/perl
使用警告;
严格使用;
使用自动模具;
使用功能qw/say/;
我的$file1,$file2=@ARGV;
我的%行;
打开我的$f1,“Perl版本:
!/usr/bin/perl
使用警告;
严格使用;
使用自动模具;
使用功能qw/say/;
我的$file1,$file2=@ARGV;
我的%行;
打开我的$f1,'Perl解决方案适合你吗?@OXXO,请不要频繁更改您的要求,这是在您的问题更改后我第三次或第四次不得不更改代码。这会让人们认为我们的代码不起作用,甚至可能会混淆。简单地给出三件事。第一个是你的输入样本,第二个是你的预期输出样本,第三个是你已经给出的你尝试过的东西。请您不要经常更改问题。Perl解决方案适合您吗?@OXXO,请不要经常更改您的要求,这是您的问题更改后我第三次或第四次不得不更改代码。这会让人们认为我们的代码不起作用,甚至可能会混淆。简单地给出三件事。第一个是你的输入样本,第二个是你的预期输出样本,第三个是你已经给出的你尝试过的东西。请您不要频繁更改问题。Shawn,tks大量用于代码,,抱歉,我对所需的输出进行了一点修改,请您更新代码,,,Shawn,tks大量用于代码,,,抱歉,我对所需的输出进行了一点修改,请您更新代码,,,Ravinder,tks大量用于代码,,很抱歉,我修改了一点所需的输出,请您更新代码,,,@OXXO,请不要频繁更改您的要求,这是我第三次或第四次不得不更改代码。这会让人们认为我的代码没有产生正确的输出,所以请不要在发布后更改您的问题。请检查一下,现在让我知道?Ravinder。。很抱歉给你换了。非常感谢你的帮助。我会跟着你advise@OXXO,你不必感到抱歉,伙计,放松点,我们都在这里互相学习和指导。但是,是的,请把问题改成非常诚实的问题,否则可能会让周围的人感到困惑。继续学习并在这个伟大的网站上分享,所以。Ravinder..非常。。我会听从你的建议。Tks againRavinder,Tks的代码很多,,对不起,我对所需的输出进行了一点修改,请您更新代码,,,@OXXO,请不要频繁更改您的要求,这是我第三次或第四次更改代码。这会让人们认为我的代码没有产生正确的输出,所以请不要在发布后更改您的问题。请检查一下,现在让我知道?Ravinder。。很抱歉给你换了。非常感谢你的帮助。我会跟着你advise@OXXO,你不必感到抱歉,伙计,放松点,我们都在这里互相学习和指导。但是,是的,请把问题改成非常诚实的问题,否则可能会让周围的人感到困惑。继续学习并在这个伟大的网站上分享,所以。Ravinder..非常。。我会听从你的建议。又来了
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
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
awk '
FNR==NR{
a[$3 $4]=$7 $8
b[$3 $4]=$5
c[$3 $4]=$6
next
}
($1 in a){
$2=b[$1]
$3=c[$1]
$1=a[$1]
found=1
}
{
$0=found==1?$0",R":$0",O"
sub(/^...../,"&,")
$1=$1
found=""
}
1
' FS="," file1 FS=" " OFS="," file2
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
$ ./example.pl file1.csv file2.txt
31431,37113,318512.50,2334387.50,100
31431,37131,999991.70,0000000.30,100,11111,22222
31431,37201,319612.50,2334387.50,100
31431,37471,111113.20,1111111.30,100,22222,33333
31431,37491,323237.50,2334387.50,100