Mam ciąg taki jak: dog cat bird whale
I chcę dostać dog dog cat cat bird bird whale whale
Wszystkie słowa są w tej samej linii. Dowolny pomysł?
Dodanie do rodziny rozwiązań :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Udostępnij plik wykonywalny, a teraz:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Alternatywnie jako funkcja powłoki, np. W celu wielokrotnego użytku w skrypcie:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
które można następnie uruchomić bezpośrednio tam, gdzie zdefiniowano jako
duplicator dog cat bird whale
Możesz użyć
sed
:Jeśli chcesz zapisać zmiany w pliku w miejscu, powiedz:
Możesz także użyć
perl
:(Dodaj
-i
opcję zapisania zmian w pliku w miejscu).Lub, jak sugeruje terdon :
Cytowanie z
perlvar
:źródło
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
Co by to było bez
awk/gawk
odpowiedzi:Jeśli końcowa nowa linia jest ważna:
źródło
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
jest zarówno krótsza, jak i bardziej czytelna, IMHO.źródło
sed -n 'p;p'
- myślałem, że to jest bardziej przejrzyste o tym, co robi.Jeśli masz ciąg w zmiennej, powiedzmy
foo="dog cat bird whale"
, możesz zrobić:Pure Bash:
Objaśnienie: Nawiasy są potrzebne, aby
read
iecho
działały w tej samej podpowłoce, a zatem mogą dzielić zmienne. Bez nich poecho
prostu wydrukowałaby pustą linię.coreutils:
Objaśnienie:
-o
Flagajoin
pozwala ustawić format wyjściowy. Mówię tutaj, aby wydrukował 1. pole 1. pliku (1.1
), a następnie 2. pole 1. pliku (1.2
) itd. W ten sposób każde pole 1. pliku jest drukowane dwukrotnie. Jednakjoin
jest przeznaczony do łączenia dwóch linii wejściowych we wspólnym polu. Więc przekazuję mu również pustą linię (<(echo)
), a następnie go ignoruję. Te-j
zestawy sprzężenia pola, ustawiając go na taki, który nie istnieje (5th) powodujejoin
wydrukowanie całej linii.Jeśli nie obchodzi Cię spacja lub kolejność wprowadzania, możesz to zrobić
Perl 1:
Wyjaśnienie:
Powyższy skrypt zapisze każde pole (z
@F
) dwa razy w tablicy,@k
a następnie wydrukuje@k
. Jeśli nie potrzebujesz końcowego znaku nowej linii, możesz to uprościćPerl 2:
Objaśnienie:
-0
opcja ustawia separator rekordu wejściowego (w systemie szesnastkowym lub liczby ósemkowej, patrz tutaj dla konwersji). Tutaj ustawiam go na ósemkę,040
która jest przestrzenią. Te-p
markiperl
wydrukować każde wejście „line”, a ponieważ musimy ustawić separator rekordu do przestrzeni, linie są obecnie określone przez przestrzenie, więc każde pole jest drukowany dwukrotnie.awk
:Objaśnienie:
NF
jest liczbą pól, więc powyższy skrypt przechodzi przez każde pole i dołącza je do siebie. Gdy to zrobisz, drukujemy linię (1;
jest po prostu skrótem do wydruku).źródło
Teraz
python
odpowiedź:Z wiersza poleceń:
Od standardowego:
Wynik w obu przypadkach:
źródło
Nieco przesadzone, ale
haskell
odpowiedź:źródło
Inne podejście, wykorzystujące tylko wbudowane bash
Nie widzę żadnych korzyści w porównaniu z najlepszą odpowiedzią, aby pokazać nieco inny sposób, który może być bardziej odpowiedni do niektórych celów.
źródło
echo
jest także powłoką wbudowaną w Bash (testtype echo
).