UNIX - Sub de dois campos concecutivos com adição de 1

2

Você poderia me ajudar a resolver o seguinte?

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

Eu tenho uma entrada como acima

  1. Eu preciso converter o .. para, separado

  2. Em seguida, a coluna 2 será subtraída da coluna 1 e a saída será adicionada com 1

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

    
por Tom O'Connor 09.11.2010 / 12:31

6 respostas

2

Canalize sua saída para o seguinte Perl:
perl -ne 'my @fields = split / \ s /, $ _; foreach my $ input (@fields) {if (/^(\d+)..(\d+)$/) {print $ 2 - $ 1 + 1, "\ n"; }} '

O que isto faz é primeiramente dividir a entrada nos espaços (assim sua primeira linha deve funcionar). Em seguida, ele executa uma expressão regular em cada entrada para corresponder a uma string que contém apenas dois números separados por .. - os colchetes colocam os números em $ 1 e $ 2.

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

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

Dado um arquivo chamado "erk", contendo seus dados:

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

Você pode canalizar a saída do seu aplicativo diretamente para o sed, em vez de cat

    
por 09.11.2010 / 12:46
1

No Bash:

while IFS=. read -r field1 null field2
do
    echo $((field2 - field1 + 1))
done < inputfile
    
por 09.11.2010 / 15:20
1
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

Se os valores estiverem em uma única linha como parece agora, você poderá usar o mais simples:

awk -F "[.]+" '{ printf("%s\n",$2-$1+1); }' filename
    
por 09.11.2010 / 12:48
0

No 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
    
por 09.11.2010 / 12:47
0
perl -pe 's/(\d+)\.\.(\d+)$/sprintf "%d,%d,%d",$1,$2,($2-$1)+1/eg;' filename

ou

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

se você quer apenas a diferença

    
por 09.11.2010 / 13:20

Tags