AWK-如果在Test1的行中找到Test2中的列,请在Test1中插入1 else 0

AWK-如果在Test1的行中找到Test2中的列,请在Test1中插入1 else 0,awk,Awk,我有两个文件Test1和Test2 测试1: 10AP23Q ERTY 10AP20J FDGC 978J15K BGTD 98KT23M ERTY 76VU14P FDGC 测试2: 23 19 15 Test1是一个固定宽度的文件。如果Test2中的列位于Test1中的第行,请插入“1”,否则请在Test1中的位置9处插入“0” 预期产出: 10AP23Q 1 ERTY 10AP20J 0 FDGC 978J15K 1 BGTD 98KT23M 1 ERTY 76VU

我有两个文件Test1和Test2

测试1:

10AP23Q   ERTY
10AP20J   FDGC
978J15K   BGTD
98KT23M   ERTY
76VU14P   FDGC
测试2:

23
19
15
Test1是一个固定宽度的文件。如果Test2中的列位于Test1中的第行,请插入“1”,否则请在Test1中的位置9处插入“0”

预期产出:

10AP23Q 1 ERTY
10AP20J 0 FDGC
978J15K 1 BGTD
98KT23M 1 ERTY
76VU14P 0 FDGC
我尝试了下面的代码。在“}”附近获取分析错误

awk 'BEGIN {if('NR==FNR {a[$1];next} (substr($0,5,2) in a)' test2 test1) (substr($0,9,1)="1") else(substr($0,9,1)="0")}'

感谢您的解决方案。

这里有一种方法:

$awk'BEGIN{FS=OFS=”“}NR==FNR{a[$0];next}
{$9=(a中的$5$6)?1:0}1'测试2测试1
10AP23第1季度
10AP20J 0 FDGC
978J15K 1 BGTD
98KT23M 1埃蒂
76VU14P 0 FDGC
  • FS=OFS=”“
    清除
    FS
    OFS
    ,使每个字段都是单独的字符,与使用
    substr
  • NR==FNR{a[$0];next}
    基于
    Test2的整行内容创建数组键
  • $9=($5$6在a中)?1:0
    检查
    Test1
    中的第5/6个字符序列是否作为键存在于数组中,并相应地更改第9个字符
    • 您也可以使用
      $9=(a中的$5$6)
      而不是三元运算符,因为
      in
      返回
      1
      ,返回
      0
      表示真情况(礼貌:)
  • 1
    打印
    $0

对于您展示的样品,请尝试以下内容

awk '
FNR==NR{
  arr[$0]
  next
}
{
  $1=$1 OFS ((substr($1,5,2) in arr)?"1":"0")
}
1
' Test2 Test1
或者根据anubhava先生的建议,上述内容可以缩短为:

awk '
FNR==NR{
  arr[$0]
  next
}
{
  $1=$1 OFS (substr($1,5,2) in arr)
}
1
' Test2 Test1
说明:添加上述内容的详细说明

awk '               ##Starting awk program from here.
FNR==NR{            ##Checking condition which will be TRUE when Test2 is being read.
  arr[$0]           ##Creating array arr with index of current line.
  next              ##next will skip all further statements from here.
}
{
  $1=$1 OFS ((substr($1,5,2) in arr)?"1":"0") ##Checking condition if sub string of 1st field is present in array then add 1 else add 0 here into $1 itself.
}
1                   ##1 will print current line here.
' Test2 Test1       ##mentioning Input_file names here.
由于要求是如果Test2中的列在Test1中的第行中找到,我不会将搜索限制在字符位置5和6:

$ awk '
NR==FNR {                                       # process file2
    r=r (r==""?"":"|") $0                       # build a regex of data (23|19|15)
    next
}
{                                               # process file1
    print substr($0,1,8) ($0~r) substr($0,10)   # output: 1-8 condition 9-
    # print $1,($0~r),$2                        # coincidently this would work also 
}' file2 file1
输出:

10AP23Q 1 ERTY
10AP20J 0 FDGC
978J15K 1 BGTD
98KT23M 1 ERTY
76VU14P 0 FDGC

如果
文件2的内容仅在位置5和6中找到,则与其他两种解决方案(此处给出)相比,此解决方案无效。

浮点数可以区分0.0和-0.0。在计算某个特性的限制时,负零应该是有益的。区分限制策略0与高质量或不良路线是否有益。

请在问题中包括文件
Test1
Test2
,而不是图片。如果没有复制粘贴功能,我们什么都做不了。已删除的图像和文件是文本格式的所有解决方案都适用于我的数据集。谢谢大家的帮助。感谢您的快速回复。@mnr,欢迎您,干杯,学习愉快。是的,这是一个通用的解决方案。非常感谢。