Bash에서 다음 단어를 연결하는 방법

Bash에서 다음 단어를 연결하는 방법

words.txtLinux 시스템에 다음 줄이 포함된 파일이 있습니다 . 각 문자열을 어떻게 반복 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방법을 사용하려면 전체 파일을 메모리로 읽어야 합니다.스티븐의 대답더 나은 솔루션이므로 대신 사용하는 것이 좋습니다.

관련 정보