Saída de números de um arquivo em uma ordem diferente

4

Eu tenho um arquivo que contém:

1 2 3 4
1 3 5 4 8
3 2 1 

Cada linha tem um número diferente de dígitos. E há mais 1000 como este.

Eu quero a saída assim:

1 2
2 3
3 4
4 0
1 3
3 5
5 4
4 8
8 0
3 2
2 1
1 0

editar feito para este post !!

Quero dizer, se este é o último dígito na linha coloque esse dígito e, em seguida, zero além dele.

por exemplo, se o dígito for o último nessa linha, colocaremos na saída nova linha esse dígito e zero

4 0 and others:see output sample tnx

no exemplo acima e

Como posso fazer isso em perl awk ou bash

eu uso isso, mas não está funcionando: ((

awk '{
for (i=1; i<NF; i++)
{
if ( $(i+1) == "")
print $i, "0"
else
print $i, $(i+1)
}
}' UniqASinline> inTestAst

o arquivo de saída do modo Mr.glenn jackman:

para isso:

3549 
3549 10026 
3549 10026 10010 
3549 10026  
awk '{for (i=1; i<=NF; i++) printf("%d %d\n", $i, $(i+1))}' filename

3549 
3549 10026
10026 
3549 10026
10026 10010
10010 
3549 10026
10026

mas esperamos que:

3549 0
3549 10026
10026 0
3549 10026
10026 10010
10010 0
3549 10026
10026 0

tnx

    
por Arash 19.12.2012 / 20:35

3 respostas

3
awk '{for (i=1; i<NF; i++) print $i, $(i+1)}' filename

EDIT: para refletir sua nova exigência

awk '{for (i=1; i<=NF; i++) printf("%d %d\n", $i, $(i+1))}' filename
# ----------------^ 

Isso tira proveito do fato de que o awk trata os valores não inicializados (aqui $(NF+1) ) como uma string vazia (no contexto da string) ou zero (no contexto numérico).

    
por 19.12.2012 / 21:11
3

Tente fazer isso em perl

 perl -lane '$c=0; for (@F){ print "$F[$c]\t$F[$c+=1]" if $F[$c+1]}' file.txt

Ou decomposto:

perl -lane '
    $c=0;
    for (@F) {
        print "$F[$c]\t$F[$c+=1]"
            if $F[$c+1];
    }
' file.txt

EXPLICAÇÕES

  • lane switchs significa: l = novas linhas; a = autosplit in @F array; n = como while (<>) operador de diamante mágico; e = switch básico para executar um comando
  • $c=0 atribui 0 a um contador
  • for (@F) { para cada elemento da linha atual
  • print "$F[$c]\t$F[$c+=1]" : elemento da matriz de impressão com indice $ c + tab + $ c + 1
  • if $F[$c+1]; : aplica a última linha apenas se $ F [$ c + 1] não for nulo

Ou usando bash (mesmo algoritmo), talvez mais legível para humanos iniciantes:

while read a; do
    arr=( $a )
    for ((i=0; i< ${#arr[@]}; i++)); do
        [[ ${arr[i+1]} ]] && echo "${arr[i]} ${arr[i+1]}"
    done
done < file.txt
    
por 19.12.2012 / 20:44
3

Aqui está uma solução pura:

while read -a a; do
    for ((i=0;i<${#a[@]}-1;++i)); do
        echo "${a[@]:i:2}"
    done
done < file.txt
    
por 19.12.2012 / 21:04