실행하는 동안 각 줄에 임의의 문자열을 추가하려고합니다.
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
그 전에 임의의 문자열이 생성됩니다.
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
문제는 각 줄에 대해 동일한 임의의 문자열을 인쇄한다는 것입니다.
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
각 줄마다 다른 임의의 문자열을 얻으려면 어떻게해야합니까?
답변
와 AWK의 system()
기능 :
샘플 input.txt
:
a
b
c
awk '{
printf "name";
system("tr -dc \047[:alnum:]\047 </dev/urandom | head -c6");
printf "-%s\n", $0
}' input.txt
샘플 출력 :
nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c
system(command)
운영 체제 명령을 실행 한command
다음 awk 프로그램으로 돌아갑니다.
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
답변
당신은 조금 명백하다고 생각하지 않습니까? 임의의 문자열을 한 번 생성 ran
하여 변수에 저장하고 모든 줄에 사용합니다!
getline
파이프에서 변수로 사용
awk '{
str_generator = "tr -dc '[:alnum:]' </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
사용하면 command | getline var
명령 출력이 파이프를 통해 getline()
변수로 전송됩니다 var
.
또한 파이프가 출력을 위해 열릴 때 파이프 awk
와 연관된 명령을 기억하며 명령에 대한 후속 쓰기가 이전 쓰기에 추가됩니다. close()
이를 방지하기 위해 명령을 명시 적으로 호출 해야 합니다.
에 내포 된 작은 따옴표로 str_generator
인해 문제가 발생하면 8 진수로 대체하십시오 ( \047
)
awk '{
str_generator = "tr -dc \047[:alnum:]\047 </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
답변
tr -dc '[:alnum:]' </dev/urandom | head -c 6
입력 라인 당 하나의 인스턴스를 실행 하면 비생산적 일 수 있습니다.
<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
{rng | getline r; print "name"r"-"$0}'
귀하의 의견은 역 따옴표 나 작은 따옴표를 포함하지 않는 경우, 당신은 또한 사용할 수 m4
의 mkstemp()
:
<input sed "s/.*/mkstemp(name)\`&'/" | m4
답변
다른 답변에 대한이 변형은 다음과 같은 외부의 임의 문자열 생성을 수행합니다 awk
.
LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6 |
awk '{ getline r <"/dev/stdin"; printf("name%s-%s\n", r, $0) }' file
tr
+의 fold
파이프 라인의 임의의 표준 입력 여섯 문자열의 끝없는 스트림을 생성한다 awk
. awk
파일 이름이 제공되면 표준 입력을 무시하므로 임의의 문자열을 변수 getline
에서 읽습니다 . 그런 다음 파일의 행 앞에 적절한 문자열을 붙이는 데 사용됩니다./dev/stdin
r
printf
주어진 파일
123
abc
@#$
이것은 생산할 수 있습니다
nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$
답변
전혀 awk를 사용하지 않고 간단하게 bash
while read line; do
printf "name%s-%s\n" \
"$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
"$line"
done <myfile
답변
paste <(base64 -w6 /dev/urandom) input.txt | awk 'NF==2{print $1$2} NF!=2{exit}'
요구 사항 -input.txt에는 열이 하나만 있어야합니다. 즉, 탭이나 공백이 없어야합니다. 즉, 탭 구분 기호 awk
및 by paste
(탭 문자 만) 명령 으로 사용 되었기 때문 입니다. 그렇지 않으면 명령을 약간 수정해야합니다.
참고 : Base64 알파벳에는 다음
이 포함 +
되며 /
문자 : Base64 테이블 , 숫자와 문자 만 원하는 경우 base32
명령 Base32 알파벳을 사용할 수 있습니다 .
입력
===my_line_a
===my_line_b
===my_line_c
===my_line_d
===my_line_e
===
명확성을 위해 추가 된 문자.
산출
LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e