2014-09-17 3 views

Répondre

0

Vous pouvez utiliser quelque chose comme ceci:

awk 'NR>1&&NR%2{print a[1],a[2],"i";i=0}{a[++i]=$2}END{print a[1],a[2],"i"}' file 

Le tableau a contient le contenu des deux lignes précédentes. En ignorant la première ligne, lorsque le numéro de ligne est impair (c'est-à-dire lorsque NR%2 est 1), imprimez les deux dernières lignes, suivies de "i". À la fin, imprimez les deux dernières lignes.

Test it out:

$ awk 'NR>1&&NR%2{print a[1],a[2],"i";i=0}{a[++i]=$2}END{print a[1],a[2],"i"}' file 
123 456 i 
789 012 i 
1

Un simple script bash en utilisant un compteur pour activer l'impression après lecture de tous les 2 lignes peuvent répondre à vos besoins. Il suffit de passer le fichier de données comme argument 1:

#!/bin/bash 

declare -i cnt=0 

while read -r line || [ -n "$line" ]; do 
    array+=(${line##* })        # read values into array 
    ((cnt++))           # increase counter 
    if [ "$cnt" -eq 2 ]; then       # if count = 2 
     printf "%s %s i\n" "${array[0]}" "${array[1]}" # print both array values 
     cnt=0           # reset count to 0 
     unset array          # unset array 
    fi 
done <"$1" 

sortie

123 456 i 
789 012 i 
+0

Juste FYI .. quand vous utilisez 'declare -i' vous pouvez écrire' cnt + = 1' sans la construction '((..))'. –

+1

Maintenant c'est un bon apprentissage, ajouté à bash toolbox! (fichier de panier de puits) –

0

Vous pouvez utiliser awk:

$ awk '$1 == "x:"{line=$2}$1 == "y:"{line=line FS $2 FS "i"; print line}' file 
123 456 i 
789 012 i 

Alternativement, une boucle read:

while read -ra line; do 
    case ${line[0]} in 
     x:) 
      new_line=${line[1]} 
      ;; 
     y:) 
      new_line+=" ${line[1]} i" 
      echo $new_line 
      ;; 
    esac 
done < file