Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
如何查找两个文件中两个字段的值之间的差异,并仅在存在差异时打印>;10使用shell_Shell_Sed_Awk_Grep - Fatal编程技术网

如何查找两个文件中两个字段的值之间的差异,并仅在存在差异时打印>;10使用shell

如何查找两个文件中两个字段的值之间的差异,并仅在存在差异时打印>;10使用shell,shell,sed,awk,grep,Shell,Sed,Awk,Grep,比如说,我有两个文件a.txt和b.txt。a.txt和b.txt的内容如下: a、 txt: abc|def|ghi|jfkdh|dfgj|hbkjdsf|ndf|10|0|cjhk|00|098r|908re| dfbk|sgvfd|ZD|zdf|2df|3w43f|ZZewd|11|19|fdgvdf|xz00|00|00 dfbk|dfdag|sgvfd|ZD|zdf|2df|3w43f|ZZewd|11|19|fdgvdf|xz00|00|00 b、 txt: abc|def|gh

比如说,我有两个文件a.txt和b.txt。a.txt和b.txt的内容如下:

a、 txt:

abc|def|ghi|jfkdh|dfgj|hbkjdsf|ndf|10|0|cjhk|00|098r|908re|
dfbk|sgvfd|ZD|zdf|2df|3w43f|ZZewd|11|19|fdgvdf|xz00|00|00
dfbk|dfdag|sgvfd|ZD|zdf|2df|3w43f|ZZewd|11|19|fdgvdf|xz00|00|00
b、 txt:

abc|def|ghi|jfkdh|dfgj|hbkjdsf|ndf|11|0|cjhk|00|098r|908re|
dfbk|sgvfd|ZD|zdf|2df|3w43f|ZZewd|22|18|fdgvdf|xz00|00|00
假设这些文件有不同的字段,以“|”分隔,可以有任意数量的行。另外,假设这两个文件都是经过排序的文件,这样我们就可以精确地匹配这两个文件之间的行。现在,我想分别找出要比较的每一行的字段8和9之间的差异,如果它们的差异大于10,则打印这些行,否则从文件中删除这些行

i、 例如,在给定的示例中,我将从a.txt和b.txt中减去| 10-11 |(分别为1(绝对值))的第8个字段,同样地,对于为0的第9个字段(0-0),两者的差值都是=10,我们打印这些行

所以输出是

a、 txt:

abc|def|ghi|jfkdh|dfgj|hbkjdsf|ndf|10|0|cjhk|00|098r|908re|
dfbk|sgvfd|ZD|zdf|2df|3w43f|ZZewd|11|19|fdgvdf|xz00|00|00
dfbk|dfdag|sgvfd|ZD|zdf|2df|3w43f|ZZewd|11|19|fdgvdf|xz00|00|00
b、 txt:

dfbk|dfdag|sgvfd|ZD|zdf|2df|3w43f|ZZewd|22|18|fdgvdf|xz00|00|00

您可以编写bash shell脚本来执行此操作:

while true; do
  read -r lineA <&3 || break
  read -r lineB <&4 || break

  vara_8=$(echo "$lineA" | cut -f8 -d "|")
  varb_8=$(echo "$lineB" | cut -f8 -d "|")
  vara_9=$(echo "$lineA" | cut -f9 -d "|")
  varb_9=$(echo "$lineB" | cut -f9 -d "|")

  if ((    vara_8-varb_8 > 10 || vara_8-varb_8 < -10
        || vara_9-varb_9 > 10 || vara_9-varb_9 < -10 )); then
    echo "$lineA" >> newA.txt
    echo "$lineB" >> newB.txt
  fi

done 3<a.txt 4<b.txt
为true时;做
阅读-r lineA 10 | | vara|u 9-varb|u 9<-10);然后
echo“$lineA”>>newA.txt
echo“$lineB”>>newB.txt
fi

完成3您可以编写bash shell脚本来执行此操作:

while true; do
  read -r lineA <&3 || break
  read -r lineB <&4 || break

  vara_8=$(echo "$lineA" | cut -f8 -d "|")
  varb_8=$(echo "$lineB" | cut -f8 -d "|")
  vara_9=$(echo "$lineA" | cut -f9 -d "|")
  varb_9=$(echo "$lineB" | cut -f9 -d "|")

  if ((    vara_8-varb_8 > 10 || vara_8-varb_8 < -10
        || vara_9-varb_9 > 10 || vara_9-varb_9 < -10 )); then
    echo "$lineA" >> newA.txt
    echo "$lineB" >> newB.txt
  fi

done 3<a.txt 4<b.txt
为true时;做
阅读-r lineA 10 | | vara|u 9-varb|u 9<-10);然后
echo“$lineA”>>newA.txt
echo“$lineB”>>newB.txt
fi

完成3您可以使用awk执行此操作:

awk -F\| 'FNR==NR{x[FNR]=$0;eight[FNR]=$8;nine[FNR]=$9;next} {d1=eight[FNR]-$8;d2=nine[FNR]-$9;if(d1>10||d1<-10||d2>10||d2<-10){print x[FNR] >> "newa";print $0 >> "newb"}}' a.txt b.txt
awk-F\|'FNR==NR{x[FNR]=$0;八[FNR]=$8;九[FNR]=$9;下一个{d1=八[FNR]-$8;d2=九[FNR]-$9;如果(d1>10 | d110 | | d2>“newa”;打印$0>“newb”}'a.txt
解释

-F
将字段分隔符设置为管道符号。
FNR==NR
之后用大括号括起来的内容仅适用于
a.txt
的处理。它表示将整行保存在数组
x[]
中,按行号(
FNR
)索引,并将第八个字段保存在数组
8[]
也按行号索引。同样,字段9保存在数组
nine[]


第二组花括号适用于处理文件b。它计算差异
d1
d2
。如果其中一个超过10,则该行将打印到每个文件
newa
newb
您可以使用awk执行此操作:

awk -F\| 'FNR==NR{x[FNR]=$0;eight[FNR]=$8;nine[FNR]=$9;next} {d1=eight[FNR]-$8;d2=nine[FNR]-$9;if(d1>10||d1<-10||d2>10||d2<-10){print x[FNR] >> "newa";print $0 >> "newb"}}' a.txt b.txt
awk-F\|'FNR==NR{x[FNR]=$0;八[FNR]=$8;九[FNR]=$9;下一个{d1=八[FNR]-$8;d2=九[FNR]-$9;如果(d1>10 | d110 | | d2>“newa”;打印$0>“newb”}'a.txt
解释

-F
将字段分隔符设置为管道符号。
FNR==NR
之后用大括号括起来的内容仅适用于
a.txt
的处理。它表示将整行保存在数组
x[]
中,按行号(
FNR
)索引,并将第八个字段保存在数组
8[]
也按行号索引。同样,字段9保存在数组
nine[]

第二组大括号适用于处理文件b。它计算差异
d1
d2
。如果其中一个超过10,则该行将打印到每个文件
newa
newb

,用于短文件 在扩展版和稍加修改的版本中,使用以下提供的方法:

解析.awk

FNR==NR{
x[FNR]=0美元
m[FNR]=8美元
n[FNR]=9美元
下一个
} 
{
if(abs(m[FNR]-$8)| | abs(n[FNR]-$9)){
打印x[FNR]>>“新A”
打印$0>>“新的”
}
}
按如下方式运行:

awk -f parse.awk a.txt b.txt
对于大型文件 上面的方法将
a.txt
读入内存。如果文件非常大,这将变得不可行,需要流式解析

它可以一次完成,但这需要仔细处理
a.txt
b.txt
中的多路复用行。一种不太容易出错的方法是识别相关行号,然后将其提取到新文件中。最后一种方法的示例如下所示

首先,您需要确定匹配行:

# Extract fields 8 and 9 from a.txt and b.txt
paste <(awk -F'|' '{print $8, $9}' OFS='\t' a.txt) \
      <(awk -F'|' '{print $8, $9}' OFS='\t' b.txt) | 

# Check if it the fields matche the criteria and print line number
awk '$1 - $3 > n || $3 - $1 > n || $2 - $4 > n || $4 - $2 > 10 { print NR }' n=10 > linesfile
提取行(可以并行运行):

短文件 在扩展版和稍加修改的版本中,使用以下提供的方法:

解析.awk

FNR==NR{
x[FNR]=0美元
m[FNR]=8美元
n[FNR]=9美元
下一个
} 
{
if(abs(m[FNR]-$8)| | abs(n[FNR]-$9)){
打印x[FNR]>>“新A”
打印$0>>“新的”
}
}
按如下方式运行:

awk -f parse.awk a.txt b.txt
对于大型文件 上面的方法将
a.txt
读入内存。如果文件非常大,这将变得不可行,需要流式解析

它可以一次完成,但这需要仔细处理
a.txt
b.txt
中的多路复用行。一种不太容易出错的方法是识别相关行号,然后将其提取到新文件中。最后一种方法的示例如下所示

首先,您需要确定匹配行:

# Extract fields 8 and 9 from a.txt and b.txt
paste <(awk -F'|' '{print $8, $9}' OFS='\t' a.txt) \
      <(awk -F'|' '{print $8, $9}' OFS='\t' b.txt) | 

# Check if it the fields matche the criteria and print line number
awk '$1 - $3 > n || $3 - $1 > n || $2 - $4 > n || $4 - $2 > 10 { print NR }' n=10 > linesfile
提取行(可以并行运行):


你的意思是计算a.txt的字段8和b.txt的字段8之间的绝对差值,以及a.txt的字段9和b.txt的字段9之间的绝对差值,如果其中任何一个差值超过10,则打印行,否则删除行?你的意思是计算a.txt的字段8和b.txt的字段8之间的绝对差值,以及还有a.txt的字段9和b.txt的字段9之间的绝对差值,如果其中一个差值超过10,则打印行,否则删除行?