Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 匹配两个文件中的值并替换选定列中的值_Awk - Fatal编程技术网

Awk 匹配两个文件中的值并替换选定列中的值

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

其目的是检查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[$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