UNIX - 将两个概念字段相加并加 1

UNIX - 将两个概念字段相加并加 1

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

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

我有如上的输入

  1. 我需要将 .. 转换为 ,分开

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

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

答案1

将您的输出通过管道传输到以下 Perl 中:
perl -ne 'my @fields = split /\s/, $_; foreach my $input (@fields) { if (/^(\d+)..(\d+)$/) { print $2 - $1 + 1, "\n"; } }'

它首先会用空格分割输入(因此第一行应该可以工作)。然后,它会对每个条目运行正则表达式,以匹配仅包含两个以 .. 分隔的数字的字符串 - 括号将数字放在 $1 和 $2 中。

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

答案2

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

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

答案3

在 Bash 中:

while IFS=. read -r field1 null field2
do
    echo $((field2 - field1 + 1))
done < inputfile

答案4

在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

相关内容