polecenia bash generują to:
Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active
Chciałbym przesłać go do czegoś, aby wyglądało tak:
Runtime Name: vmhba2:C0:T1:L14 Group State: active
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]
tj. usuń co drugą linię
Próbowałem, ... |tr "\nGroup" " "
ale usunąłem wszystkie nowe wiersze i zjadłem też kilka innych liter. dzięki
tr
jest całkowicie oparty na znakach: poprosiłeś tr, aby usunąć znaki nowej linii oraz wszystkie „G”, „r”, „o”, „u” i „p”.Odpowiedzi:
nie mogę teraz przetestować, ale
powinien to zrobić
źródło
paste -d ' ' - -
zamiast tego doda spację, jeśli jest to wymagane)-
? Dziękipaste
służy do łączenia odpowiednich linii z plików:paste file1 file2 file3 ...
. Jeśli jednym z argumentów „plik” jest „-”, wiersze są odczytywane ze standardowego wejścia. Jeśli są 2 argumenty „-”, wówczas wklej pobiera 2 linie ze standardowego wejścia. I tak dalej. Zobacz stronę manuala .Jedną z możliwości jest:
Jeśli numer linii jest równomiernie podzielny przez 2, zakończ nową linię, w przeciwnym razie zakończ spacją.
(Testowane na: CentOS 6, GNU Awk 3.1.7)
Za pomocą sed (patrz wyjaśnienie ):
Dalsza lektura:
źródło
Jeśli chcesz użyć
sed
, nie ma powodu, aby czytać cały plik do pamięci. Możesz scalić każdą inną linię w ten sposób:Zamiast spacji użyj dowolnej postaci.
Oto inny sposób korzystania z awk:
Te
if/else
uchwyty przypadku, gdy nie ma nieparzystą liczbę wierszy w pliku. Bez tego nieparzysta ostatnia linia jest drukowana dwukrotnie. W przeciwnym razie możesz dla porównania:źródło
awk '{printf "%s", $0; $0=""; getline; print " " $0}'
Najbardziej idiomatyczny sposób na zrobienie tego
awk
jest następujący:Wytwarza:
Aby to wyjaśnić, musimy zdefiniować każdą z wbudowanych zmiennych:
RS
separator rekordów. Domyślnie\n
(nowa linia).ORS
separator rekordów wyjściowych. Domyślnie\n
(nowa linia).FS
separator pola. Domyślnie(spacja).
NR
liczba rekordów.Ponieważ domyślnym separatorem rekordów jest nowa linia, rekord jest domyślnie linią.
NR%2
jest modułemNR/2
, tak że będzie albo0
albo1
.0
dla linii parzystych i1
dla linii nieparzystych.var=condition?condition_if_true:condition_if_false
jest operatorem trójskładnikowym.Wszyscy razem, mówiąc,
ORS=NR%2?FS:RS
że definiujemy separator rekordu wyjściowego:2k + 1
, to znaczy w liniach parzystych, to separatory rekordów wyjściowych są ustawione naFS
spację.2k
, to znaczy w nieparzystych liniach, to separatory rekordów wyjściowych są ustawione naRS
, to znaczy nową linię.W ten sposób nieparzyste linie kończą się spacją, która jest następnie łączona z następną linią. Po tej linii drukowana jest nowa linia.
Więcej informacji w idiomatic awk .
źródło
Działa to dla mnie w systemie Linux:
Zastępuje to puste miejsce dla znaku nowej linii; Państwo musi uciec znak nowej linii na rzeczy działało poprawnie.
źródło
W bash:
źródło
Jeśli Perl jest opcją:
perl -pe 's/\n/ / if $. % 2 == 1' file
s/\n/ /
zastępuje znak nowej linii spacją$.
jest numerem liniiźródło
Co powiesz na używanie
grep
?źródło