words.txt
Linux 시스템에 다음 줄이 포함된 파일이 있습니다 . 각 문자열을 어떻게 반복 user
하고 1에서 4 사이의 숫자를 추가할 apple
수 있나요?banana
user
apple
banana
예상 출력:
user1
user2
user3
user4
apple1
apple2
apple3
apple4
banana1
banana2
banana3
banana4
다음을 시도했지만 1개의 문자열에만 작동합니다.
seq 1 4 | awk {'print $0 "user"'}
답변1
awk
표준 도구 상자가 아마도 최선의 선택일 것입니다.
awk -v min=1 -v max=4 -v increment=1 '
{for (i = min; i <= max; i += increment) print $0 i}' words.txt
GNU 도구에서 영감을 얻으세요@JJoao 두 파일 라인의 데카르트 곱을 얻는 방법:
join -t $'\n' -j2 -o1.1,2.1 words.txt <(seq 4) | paste -d '\0' - -
두 번째 필드에 words.txt
조인하고 출력하는 경우 seq 4
, 여기서는 필드 구분 기호를 줄 바꿈으로 정의했기 때문에 두 번째 필드가 있을 수 없습니다. 즉, 두 파일의 각 줄에 대해 두 번째 필드가 모두 비어 있으므로 결국 모든 것을 함께 결합합니다.
답변2
sed 's/.*/&1\n&2\n&3\n&4/' words.txt
각 줄( )의 모든 항목을 바꾸고( s
명령) 전체에서 여러 번 나타나는 ( )를 일치시키고 영숫자 및 개행 문자를 추가합니다..*
&
답변3
일반 bash 사용:
while IFS= read -r word; do printf "${word}%d\\n" {1..4}; done < words.txt
그러나 변수를 printf 형식 문자열에 넣으면 예기치 않은 문자가 발생할 수 있습니다. 예를 들어:
$ cat words.txt
with \n newline
with %s directive
$ while IFS= read -r word; do printf "${word}%d\\n" {1..4}; done < words.txt
with
newline1
with
newline2
with
newline3
with
newline4
with 1 directive2
with 3 directive4
백슬래시 시퀀스가 해석되고 %
지침이 준수됩니다. 이를 보호하기 위해 간단한 한 줄 솔루션은 다음과 같습니다.
while IFS= read -r word; do
tmp1=${word//%/%%}
tmp2=${tmp1//\\/\\\\}
printf "${tmp2}%d\\n" {1..4}
done < words.txt
어느 출력
with \n newline1
with \n newline2
with \n newline3
with \n newline4
with %s directive1
with %s directive2
with %s directive3
with %s directive4
답변4
파일 길이가 실제로 4줄에 불과한 경우 다음과 같이 간단한 작업을 수행할 수 있습니다.
$ while read word; do seq 1 4 | awk -v w="$word" '{print w$0}'; done < words.txt
user1
user2
user3
user4
apple1
apple2
apple3
apple4
banana1
banana2
banana3
banana4
하지만이건 좋은 생각이 아니야쉘을 사용하여 이와 같은 작업을 수행하므로 여기에 기본 GNU awk(원래 순서를 유지하므로) 솔루션이 있습니다.
$ gawk '{ words[$0] }END{for (word in words){ for(i=1;i<5;i++){printf "%s%d\n",word,i}}}' words.txt
user1
user2
user3
user4
apple1
apple2
apple3
apple4
banana1
banana2
banana3
banana4
이 awk
방법을 사용하려면 전체 파일을 메모리로 읽어야 합니다.스티븐의 대답더 나은 솔루션이므로 대신 사용하는 것이 좋습니다.