각 줄에 임의의 문자열을 추가하려면 어떻게합니까?


12

실행하는 동안 각 줄에 임의의 문자열을 추가하려고합니다.

awk '{print "name" "'$ran'" "-"$0}' 'myfile'

그 전에 임의의 문자열이 생성됩니다.

ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"

문제는 각 줄에 대해 동일한 임의의 문자열을 인쇄한다는 것입니다.

nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-

각 줄마다 다른 임의의 문자열을 얻으려면 어떻게해야합니까?


의 약간의 변형 대신에 tr -dc '[:alnum:]' </dev/urandom | head -c 6, 사용하는 것이 더 간단하고 계산적으로 효율적 pwgen -s 6 1이거나 더 좋을 pwgen -s 6 $(wc -l myfile)것입니다. 단 한번에 필요한 모든 임의의 문자열을 정확하게 얻을 수 있습니다.
user1404316

답변:


9

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


근데 근데 왜 내가 tr: write error: Broken pipe?
user134969

@ user134969, 잘 작동합니다. 명령 행에서 오류가 발생하지 않았는지 확인하십시오
RomanPerekhrest

9

당신은 조금 명백하다고 생각하지 않습니까? 임의의 문자열을 한 번 생성 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

8

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}'

귀하의 의견은 역 따옴표 나 작은 따옴표를 포함하지 않는 경우, 당신은 또한 사용할 수 m4mkstemp():

<input sed "s/.*/mkstemp(name)\`&'/" | m4

4

다른 답변에 대한이 변형은 다음과 같은 외부의 임의 문자열 생성을 수행합니다 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/stdinrprintf

주어진 파일

123
abc
@#$

이것은 생산할 수 있습니다

nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$


0
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.