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
Odpowiedzi:
EDYTUJ: aby odzwierciedlić nowe wymagania
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).źródło
Spróbuj to zrobić perl
Lub rozłożone:
WYJAŚNIENIA
lane
przełączniki oznaczają: l = znaki nowej linii; a = autosplit w tablicy @F; n = jakwhile (<>)
operator magicznego diamentu; e = podstawowy przełącznik do uruchomienia polecenia$c=0
przypisz 0 do licznikafor (@F) {
dla każdego elementu bieżącej liniiprint "$F[$c]\t$F[$c+=1]"
: drukuj element tablicy z indeksem $ c + tab + $ c + 1if $F[$c+1];
: zastosuj ostatnią linię tylko wtedy, gdy $ F [$ c + 1] nie ma wartości NULLLub za pomocą grzmotnąć (ten sam algorytm), może bardziej czytelny dla ludzi dla początkujących:
źródło
Oto czyste rozwiązanie bash:
źródło