각 행에 임의의 문자열을 추가하는 방법은 무엇입니까?

각 행에 임의의 문자열을 추가하는 방법은 무엇입니까?

런타임에 각 줄에 임의의 문자열을 추가하려고 합니다.

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

그 전에 임의의 문자열을 생성하십시오.

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

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

nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-

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

답변1

이게 좀 뻔하다고 생각하지 않나요? 임의의 문자열을 한 번 생성하여 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

답변2

그리고 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

답변3

입력 줄당 하나의 인스턴스를 실행하는 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}'

답변4

awk를 전혀 사용할 필요가 없습니다. 매우 간단합니다.bash

while read line; do
    printf "name%s-%s\n" \
        "$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
        "$line"
done <myfile

관련 정보