Wyprowadzaj liczby z pliku w innej kolejności


4

Mam plik zawierający:

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

Każda linia ma inną liczbę cyfr. I jest jeszcze 1000 takich.

Chcę, aby wyjście było takie:

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

edytuj ten post !!

mam na myśli, że jeśli jest to ostatnia cyfra w wierszu, umieść tę cyfrę, a następnie zero poza nią.

na przykład, jeśli cyfra jest ostatnia w tym wierszu, umieszczamy na wyjściu nową linię tę cyfrę i zero

4 0 and others:see output sample tnx

w powyższym przykładzie i

Jak mogę to zrobić, w perl awk lub bash

używam tego, ale nie działa: ((

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

plik wyjściowy z metody Mr.glenn jackman:

dla tego wejścia:

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

ale oczekujemy:

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

tnx


Brzmi jak zadanie domowe =)
Gilles Quenot

mogę to zrobić, wysyłając element do tablicy, a następnie przetwarzając tablicę, ale jeśli mamy 1000 linii, to jest zbyt wolny w bashu: ((!!!!
Arash

Odpowiedzi:


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

EDYTUJ: aby odzwierciedlić nowe wymagania

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

Wykorzystuje to fakt, że awk traktuje niezainicjowane wartości (tutaj $(NF+1) ) jako pusty ciąg (w kontekście ciągu) lub zero (w kontekście numerycznym).


oh, przepraszam, zmieniłam to, czego potrzebuję, w powyższej edycji
Arash

mam na myśli, że jeśli jest to ostatnia cyfra w linii, umieść tę cyfrę, a następnie zero.
Arash

jak mogę zmienić ten awk? wielkie dzięki
Arash

Chcę też umieścić 0 nie za darmo
Arash

tnx, ale twój skrypt wykonuje 1 2,2 3,3 4,4 "" (wolne miejsce nie „0”)
Arash

3

Spróbuj to zrobić

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

Lub rozłożone:

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

WYJAŚNIENIA

  • lane przełączniki oznaczają: l = znaki nowej linii; a = autosplit w tablicy @F; n = jak while (<>) operator magicznego diamentu; e = podstawowy przełącznik do uruchomienia polecenia
  • $c=0 przypisz 0 do licznika
  • for (@F) { dla każdego elementu bieżącej linii
  • print "$F[$c]\t$F[$c+=1]" : drukuj element tablicy z indeksem $ c + tab + $ c + 1
  • if $F[$c+1]; : zastosuj ostatnią linię tylko wtedy, gdy $ F [$ c + 1] nie ma wartości NULL

Lub za pomocą (ten sam algorytm), może bardziej czytelny dla ludzi dla początkujących:

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

2
Chociaż to (prawdopodobnie nie może przetestować) daje OP to, czego chcą, byłoby miło wyjaśnić, co dokładnie robi, aby każdy, kto ją zobaczy, mógł się trochę nauczyć.
slhck

1
Jasne, robię to teraz
Gilles Quenot

1
Przepraszamy, zapomniałem o cytacie =)
Gilles Quenot

1
Bądź precyzyjny. Czy przetestowałeś 3 różne wersje?
Gilles Quenot

2
Czy możesz pokazać nam trochę wysiłku wyszukiwania? Google ma mnóstwo wyników dla tego rodzaju rzeczy: / Jeśli to naprawdę praca domowa, za tydzień zapomnisz o tym wszystkim ... Powąchaj.
Gilles Quenot

3

Oto czyste rozwiązanie bash:

while read -a a; do
    for ((i=0;i<${#a[@]}-1;++i)); do
        echo "${a[@]:i:2}"
    done
done < file.txt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.