Próbuję dodać losowy ciąg dla każdej linii podczas działania:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Wcześniej generowany jest losowy ciąg:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
Problem polega na tym, że wypisze ten sam losowy ciąg dla każdej linii:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
Co powinienem zrobić, aby uzyskać inny losowy ciąg dla każdej linii?
tr -dc '[:alnum:]' </dev/urandom | head -c 6
, byłoby prostsze i bardziej wydajne obliczeniowo w użyciupwgen -s 6 1
, lub jeszcze lepiejpwgen -s 6 $(wc -l myfile)
da dokładnie wszystkie losowe ciągi, których potrzebujesz, w jednym ujęciu.Odpowiedzi:
Z funkcją awk
system()
:Próbka
input.txt
:Przykładowe dane wyjściowe:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
źródło
tr: write error: Broken pipe
?Nie uważasz, że to trochę oczywiste? Po prostu generujesz losowy ciąg jeden raz, przechowujesz go w
ran
zmiennej i używasz go dla wszystkich linii!Używanie
getline
do zmiennej z potokuGdy używasz
command | getline var
, dane wyjściowe polecenia są przesyłane przez potok dogetline()
i do zmiennejvar
.Zauważ też, że gdy potok jest otwarty dla danych wyjściowych,
awk
pamięta związane z nim polecenie, a kolejne zapisy do polecenia są dołączane do poprzednich zapisów. Musimy wykonać jawneclose()
wywołanie polecenia, aby temu zapobiec.Jeśli zagnieżdżone pojedyncze cudzysłowy
str_generator
powodują problem, zamień na jego ósemkowy odpowiednik (\047
)źródło
Uruchomienie jednego wystąpienia
tr -dc '[:alnum:]' </dev/urandom | head -c 6
wiersza danych wejściowych przyniosłoby efekt przeciwny do zamierzonego, lepiej byłoby zrobić:Jeśli wejście nie zawiera odwrócone, pojedyncze apostrofy ani apostrofów, można również użyć
m4
„smkstemp()
:źródło
Ta odmiana kilku innych odpowiedzi powoduje losowe generowanie ciągu poza
awk
:tr
+fold
Rurociąg generuje niekończący się strumień losowych ciągów sześciu znaków na standardowe wejścieawk
.awk
zignoruje standardowe wejście, jeśli podano nazwę pliku, więc te losowe ciągi znaków są odczytywanegetline
ze/dev/stdin
zmiennejr
.printf
jest następnie używany do prefiksu wierszy z pliku odpowiednim ciągiem.Biorąc pod uwagę plik
to może produkować
źródło
Bez użycia awk, po prostu proste
bash
źródło
Wymagania - plik input.txt powinien zawierać tylko jedną kolumnę, innymi słowy, nie powinien mieć tabulatorów ani spacji, ponieważ były one używane jako domyślny separator poleceń
awk
ipaste
(tylko znak tabulacji). W przeciwnym razie polecenie musi zostać nieco zmodyfikowane.Uwaga: Base64 alfabet zawiera
+
i/
znaków: stół Base64 , jeśli chcesz tylko cyfry i litery, można użyćbase32
polecenia - Base32 alfabetu .Wejście
===
znaki dodane dla jasności.Wynik
źródło