Question Numéros de sortie d'un fichier dans un ordre différent


J'ai un fichier qui contient:

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

Chaque ligne a un nombre de chiffres différent. Et il y en a 1000 autres comme ça.

Je veux la sortie comme ceci:

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

édition faite à cet article !!

Je veux dire que si c'est le dernier chiffre de la ligne, mettez ce chiffre et ensuite zéro.

par exemple si digit est la dernière dans cette ligne, nous mettons en sortie nouvelle ligne ce chiffre et zéro

4 0 and others:see output sample tnx

dans l'exemple ci-dessus et

Comment puis-je le faire, en perl  awk ou bash

Je l'utilise mais son ne fonctionne pas: ((

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

le fichier de sortie de la manière jackman de Mr.glenn:

pour cette imput:

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

mais nous attendons:

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

tnx


4
2017-12-19 19:35


origine


Sonne comme un devoir =) - Gilles Quenot
Je peux le faire en envoyant un élément dans le tableau et ensuite traiter le tableau mais si nous avons 1000 lignes c'est trop lent dans bash: ((!!!! - Arash


Réponses:


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

EDIT: pour refléter votre nouvelle exigence

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

Ceci tire parti du fait que awk traite les valeurs non initialisées (ici $(NF+1)) comme une chaîne vide (dans un contexte de chaîne) ou zéro (dans un contexte numérique).


3
2017-12-19 20:11



oh je suis désolé de changer la sortie j'ai besoin de cela, dans le post ci-dessus édité - Arash
Je veux dire que si c'est le dernier chiffre de la ligne, mettez ce chiffre et ensuite zéro. - Arash
comment pourrais-je chane cette awk ?? Merci beaucoup - Arash
je veux trop mettre 0 pas d'espace libre - Arash
tnx mais votre script fait 1 2,2 3,3 4,4 "" (espace libre pas "0") - Arash


Essayez de le faire en

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

Ou décomposé:

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

EXPLICATIONS

  • lane commutateurs signifie: l = nouvelles lignes; a = autosplit dans le tableau @F; n = comme while (<>) opérateur de diamants magiques; e = commutateur de base pour exécuter une commande
  • $c=0 attribuer 0 à un compteur
  • for (@F) { pour chaque élément de la ligne courante
  • print "$F[$c]\t$F[$c+=1]" : élément tableau d'impression avec indice $ c + tab + $ c + 1
  • if $F[$c+1]; : appliquer la dernière ligne seulement si $ F [$ c + 1] n'est pas nul

Ou en utilisant  (même algorithme), peut-être plus lisible pour les débutants:

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

3
2017-12-19 19:44



Bien que cela (probablement, ne puisse pas tester) donne au PO ce qu'il veut, il serait bien d'expliquer ce que cela fait exactement, pour que tout le monde puisse le voir. - slhck
Bien sûr, je le fais maintenant - Gilles Quenot
Désolé, un devis oublié =) - Gilles Quenot
Être précis. Avez-vous testé les 3 versions différentes? - Gilles Quenot
Pouvez-vous nous montrer un peu d'effort de recherche? Google a des tonnes de résultats pour ce genre de choses: / Si c'est vraiment un devoir, en 1 semaine vous allez oublier tout ça ... Sniff. - Gilles Quenot


Voici une solution de base pure:

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

3
2017-12-19 20:04