다음 설명은 내가 달성하고자 하는 것만을 나타냅니다.
두 개의 텍스트 파일이 있습니다. 첫 번째 텍스트 파일에는 log1.txt
다음 항목이 포함되어 있습니다.
Black
Blue
Brown
Copper
Cyan
Gold
Gray
Green
두 번째 텍스트 파일에는 log2.txt
다음 항목이 포함되어 있습니다.
Ugly
Nice
cool
pretty
두 텍스트를 동시에 읽고 다음 출력을 생성하고 싶습니다.
The first color Black is Ugly
The second color Blue is Nice
The third color Brown is cool
The fourth color Copper is pretty
The fifth color Cyan is Ugly
The sixth color Gold is Nice
The seventh color Gray is cool
The eighth color Green is pretty
또는를 사용하여 bash
이전 출력을 어떻게 얻을 수 있습니까 shell
? 두 개의 루프를 동시에 적용해 보았습니다: for loop" and/or
while 루프` 그러나 작동하지 않았습니다! 예를 들어 다음과 같은 어색한 코드를 시도해 보았습니다.
#!/bin/bash
while IFS= read -r line; do
for ii in $(cat log1.txt); do
echo "The first color "$i "is" $ii
done <log2.txt
done
"첫 번째 색상", "두 번째 색상" 등을 변경하는 방법을 모르거나 모릅니다.
답변1
데비안에서는 with zsh
및 with 와 libnumbertext-tools
함께 spellout
:
#! /bin/zsh -
colors=(${(f)"$(<log1.txt)"})
adjectives=(${(f)"$(head -n ${#colors} <log2.txt)"})
/usr/lib/libnumbertext/spellout -l /usr/share/libnumbertext/en \
-p ordinal 1-$#colors |
for color adjective in ${colors:^^adjectives}; do
read num &&
print -r The $num color $color is $adjective
done
(이것은 미국 영어입니다. 예를 들어 101의 경우백번째 우선바꾸다백일)
숫자를 철자하는 소프트웨어를 설치할 수 없지만 zsh
세 번째 파일에 영어 서수 목록이 있는 경우 (적어도 Bourne, rc, fish와 같은) 다음을 log3.txt
포함하여 대부분의 셸에서 이 작업을 수행할 수 있습니다 .bash
#! /bin/sh -
awk '
BEGIN {while ((getline a < "log2.txt") > 0) adjective[na++] = a}
{
if ((getline num < "log3.txt") <= 0) num = NR "th"
print "The "num" color "$0" is "adjective[(NR-1)%na]
}' log1.txt
<digits>th
(영어 숫자가 부족한 경우 대체)
답변2
쉘은 영어를 이해하지 못하므로 임의 개수에 대한 올바른 접미사가 포함된 철자 숫자를 자동으로 생성하려면 추가 작업이 필요합니다. 번호 매기기에 숫자만 사용하고 추가로 log1.txt가 더 긴 파일이라고 가정하면 다음을 시도해 보십시오.
#!/bin/bash
log1_length=$(wc -l <log1.txt)
log2_length=$(wc -l <log2.txt)
for i in $(seq $log1_length); do
arg1=$(head -$i <log1.txt | tail -1)
arg2=$(head -$(((i-1) % log2_length + 1)) <log2.txt | tail -1)
echo "Color No. $i $arg1 is $arg2."
done
답변3
당신은 당신이 원하는 것을 달성 할 수 있습니다케이스 제어 구조다음과 같이:
#!/bin/bash
log1_length=$(wc -l <log1.txt)
log2_length=$(wc -l <log2.txt)
for i in $(seq $log1_length); do
arg1="$(head -$i <log1.txt | tail -1)"
arg2="$(head -$(((i-1) % log2_length + 1)) <log2.txt | tail -1)"
# Case control structure to replace digit equivalent in words
case ${i} in
1) echo -n "The first color ";;
2) echo -n "The second color ";;
3) echo -n "The third color ";;
4) echo -n "The fourth color ";;
5) echo -n "The fifth color ";;
6) echo -n "The sixth color ";;
7) echo -n "The seventh color ";;
8) echo -n "The eighth color ";;
9) echo -n "The ninth color ";;
10) echo -n "The tenth color ";;
11) echo -n "The eleventh color ";;
esac
echo ${i}"$i${arg1} is ${arg2}" | tr -d '0123456789'
done
출력은 다음과 같습니다.
The first color Black is Ugly
The second color Blue is Nice
The third color Brown is cool
The fourth color Copper is pretty
The fifth color Cyan is Ugly
The sixth color Gold is Nice
The seventh color Gray is cool
The eighth color Green is pretty
답변4
아무도 배열 사용을 제안하지 않았다는 사실에 놀랐습니다. 다음은 대략적인 시도입니다( log3.txt
위의 @Stephane의 아이디어를 사용함).
#!/bin/bash
nl1=$( wc -l < log1.txt )
nl2=$( wc -l < log2.txt )
nlnums=$( wc -l < nums.txt )
declare -a arr1[$nl1]
declare -a arr2[$nl2]
declare -a nums[$nlnums]
for (( i=0; i < $nl1; i++ ))
do
read arr1[$i]
done < log1.txt
for (( i=0; i < $nl2; i++ ))
do
read arr2[$i]
done < log2.txt
for (( i=0; i < $nlnums; i++ ))
do
read nums[$i]
done < nums.txt
j=0
for (( i=0; i < $nl1; i++ ))
do
echo "The ${nums[$i]} color ${arr1[$i]} is ${arr2[$j]}"
j=$(( (j+1) % $nl2 ))
done
파일의 내용은 nums.txt
다음과 같습니다.
first
second
third
fourth
fifth
sixth
seventh
eighth
ninth
tenth
코드는 약간의 정리가 필요하지만 요점을 보여줍니다.