![각 행에 임의의 문자열을 추가하는 방법은 무엇입니까?](https://linux55.com/image/129102/%EA%B0%81%20%ED%96%89%EC%97%90%20%EC%9E%84%EC%9D%98%EC%9D%98%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
런타임에 각 줄에 임의의 문자열을 추가하려고 합니다.
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