UNIX – 添加1的两个连续字段的子项

您能否帮我解决以下问题?

20066898701..20066901700 20066891201..20066893700 20066879201..20066888700 20009429701..20009439700 20009412201..20009414700 

我有一个input如上

  1. 我需要将..转换,分离

  2. 然后,第2列将从第1列中减去,并输出加1

20066898701..20066901700 => (20066901700-20066898701)+1 => 3000

将你的输出input到下面的Perl中:
perl -ne'my @fields = split / \ s /,$ _; foreach $ input(@fields){if(/^(\d+)..(\d+)$/){print $ 2 – $ 1 + 1,“\ n”; }}

这是做什么是首先拆分input空间(所以你的第一行应该工作)。 然后它在每个条目上运行一个正则expression式来匹配一个只包含两个以..号隔开的数字的string – 括号将数字放在$ 1和$ 2中。

例如: echo "20066898701..20066901700" | perl -ne 'my @fields = split /\s/, $_; foreach my $input (@fields) { if (/^(\d+)\.\.(\d+)$/) { print $2 - $1 + 1, "\n"; } }' 3000 echo "20066898701..20066901700" | perl -ne 'my @fields = split /\s/, $_; foreach my $input (@fields) { if (/^(\d+)\.\.(\d+)$/) { print $2 - $1 + 1, "\n"; } }' 3000

 sed 's/\.\./,/g'<erk|awk 'BEGIN { FS = ","}; { total = ($2 - $1) +1; print total} 

给定一个名为“erk”的文件,其中包含您的数据:

 tom@holborn:~$ cat erk | sed 's/\.\./,/g'| awk 'BEGIN { FS = ","}; { total = ($2 - $1) +1; print total}' 3000 2500 9500 10000 2500 

您可以将应用程序的输出直接inputsed,而不是cat

在Bash:

 while IFS=. read -r field1 null field2 do echo $((field2 - field1 + 1)) done < inputfile 
 for i in 20066898701..20066901700 20066891201..20066893700 20066879201..20066888700 20009429701..20009439700 20009412201..20009414700 do echo $i | awk -F "[.]+" '{ printf("%s\n",$2-$1+1); }' done 3000 2500 9500 10000 2500 

如果值现在看起来像一行,那么可以使用更简单的方法:

 awk -F "[.]+" '{ printf("%s\n",$2-$1+1); }' filename 

在bash中:

 cat file-with-numbers.txt | while read i do first=`echo $i | cut -f1 -d.` second=`echo $i | cut -f3 -d.` expr $second - $first + 1 done 
 perl -pe 's/(\d+)\.\.(\d+)$/sprintf "%d,%d,%d",$1,$2,($2-$1)+1/eg;' filename 

要么

 perl -pe 's/(\d+)\.\.(\d+)$/($2-$1)+1/eg;' filename 

如果你只是想要的差异