텍스트 줄 블록을 반복했습니다.
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love baby
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love baby
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love baby
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love baby
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love baby
I love watermelon
다음 텍스트가 포함된 다른 파일이 있습니다.
D1
D2
D3
D4
D5
용어가 발견될 때마다 baby
두 번째 파일의 연속 용어로 대체되어야 합니다. 예를 들어 first 의 경우 다음 baby
으로 대체됩니다.
I love D1
두 번째 항목의 경우 파일 끝까지 baby
대체됩니다 . D2
아래에는 실패한 시도에 대한 요약이 나와 있습니다(매우 캐주얼하게 언급되었습니다...죄송합니다). 누구든지 나를 도와줄 수 있나요?
for x in `cat test1.txt|tr -d '\r'`; do awk '{gsub(/baby/,'"$x"')}' test3.txt ; done
for x in `cat test1.txt|tr -d '\r'`; do sed -i 's/baby/$x/g' test3.txt ; done
sed "0,/baby/{s/baby/$x/}" "test3.txt"
for x in `cat test1.txt|tr -d '\r'`; do awk 'NR==1,/baby/{sub(/baby/,'"$x"')} print' test3.txt ; done
awk '/^baby$/&&getline<"test1.txt"||1' test3.txt
awk 'NR==FNR{Arr[NR]=$0;next}{if($0==baby){i++;print Arr[i]}else{print}}' test3.txt test1.txt
#!/bin/bash
while read -r line; do
if [[ "$line" == baby ]]; then
sed -n '1p' test3.txt
sed -i".bup" '1d' test3.txt
else
echo "$line"
fi
done < test1.txt
답변1
file2.txt
발생 횟수보다 입력 줄이 더 많다고 확신하는 경우 baby
간단한 스크립트를 사용할 수 있습니다.
awk 'BEGIN{ sf="file2.txt"}
/baby/ { getline var <sf; gsub(/baby/,var,$0) }
print
' file1.txt
그러나 더 강력한 스크립트는 판독값에 file2.txt
오류가 있는지 확인하거나 스크립트가 file2.txt의 끝에 도달하면 처음으로 돌아갈 수 있습니다.
awk 'BEGIN{ sf="file2.txt"}
/baby/{
# If at the end of second file, rewind to start.
while( (test=(getline var <sf)) != 1 ){
if( test==-1 ){ print "Error: file ",sf,":",ERRNO; exit 1 }
if( test==0 ){ close(sf); continue }
# This script should never get up to here
print "Unexpected error"; exit 2
}
sub(/baby/,var ,$0)
}
1
' file1.txt
file2.txt에 D1, D2, D3, D4 네 줄만 포함되어 있으면 다음과 같은 결과가 나타납니다.
$ ./script
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D2
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D3
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D4
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon
답변2
또 다른 이상한
awk -v f='file2' '$3=="baby"{getline $3 <f}1' file1
file1의 field3=baby가 $3을 file2의 한 줄로 바꿀 때마다.
편집하다:
내가 잘 이해한다면 file1의 행은 다음과 같습니다.
Ilovepeaches
Ilovemybeautifulbabygirl
Ilovewatermelon
각 아기를 file2의 한 줄로 바꾸고 싶습니다.
따라서 다음과 같이 시도해 볼 수 있습니다.
awk -v search='baby' -v f='file2' '
$0 ~ search {
split($0,lign,search)
getline <f
$0=lign[1]$0lign[2]
}1' file1
산출:
Ilovepeaches
IlovemybeautifulD3girl
Ilovewatermelon
답변3
file2
대체 텍스트 및 file1
반복 텍스트를 포함하여 awk 사용 :
awk 'FNR == NR {baby[NR] = $0; next} /baby/ {count++; $NF = baby[count]} 1' file2 file1
이는 file2
첫 번째 파일 매개변수이지 file1
.
설명하다:
FNR == NR
이는 awk가 읽는 첫 번째 파일에 적합하므로file2
여기에 있습니다. 이 파일의 경우 각 줄을 줄 번호로 색인된 배열에 저장합니다.- 두 번째 파일의 경우
count
일치하는 각 줄을 유지baby
하고 배열에서 해당 개수에 대한 항목을 가져온 다음 마지막 필드를 해당 항목으로 바꿉니다.
내가 얻는 결과는 다음과 같습니다.
~ awk 'FNR == NR {baby[NR] = $0; next} /baby/ {count++; $NF = baby[count]} 1' file2 file1
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D2
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D3
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D4
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D5
I love watermelon