您能否帮我解决以下问题?
20066898701..20066901700 20066891201..20066893700 20066879201..20066888700 20009429701..20009439700 20009412201..20009414700
我有一个input如上
我需要将..转换,分离
然后,第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
如果你只是想要的差异