다음과 같은 상황이 있는지 생각해 보세요.
cat /home/r1/f1.txt
sch1.t1
sch2.t2
sch2.t3
sch1.t4
나에게도 파일이 있다
cat /home/r2/sch1.t1.txt
data
cat /home/r2/sch2.t2.txt
data1
f1.txt의 sch1.t1을 다른 디렉토리(sch1.t1, .txt)에 있는 파일과 일치시키고 다음을 f1.txt 자체에 붙여넣어야 합니다.
산출:
f1.txt
sch1.t1 data
sch2.t2 data1
f1.txt만 있고 sch(1..n).t(1..n)이 많을 수 있습니다. 각 sch(1..n).t(1..n)은 단 한 줄의 데이터만 포함하는 별도의 파일입니다.
중복된 질문인 경우 해결하도록 안내해 주세요.
코드를 시험해 보았습니다.
while read line
do
paste f1.txt <(cut -f2 /home/r2/$line.txt) >> out_file.txt
mv out_file.txt /home/r1/f1.txt
done < /home/r1/f1.txt
답장을 보내 주셔서 감사합니다. 질문이 업데이트되었습니다. 파일이 비어 있는지 고려하십시오(Sch1.t4.txt). 스니펫을 포함할 위치)
for file in /*.txt;
do
if [ ! -s $file ]; then
echo "NA"> $file;
fi;
done
산출:
f1.txt
sch1.t1 data
sch2.t2 data1
sch1.t4 NA
답변1
내가 처리하는 방법은 간단한 루프를 사용하여 각 항목을 읽고 f1.txt
이를 사용하여 결과 파일을 작성하는 것입니다. 완료되면 f1.txt
원하는 경우 원본 파일을 덮어 쓸 수 있습니다.
#!/bin/sh
ctrl=/home/r1
base=/home/r2
# Loop across each entry
while IFS= read -r name
do
# Derive filename
file="$base/$name.txt"
# Fix up if it doesn't already exist (or is zero length)
[ ! -s "$file" ] && printf '%s\n' 'NA' >"$file"
# Record what we've got
printf '%s %s\n' "$name" "$(xargs <"$file")"
done <"$ctrl/f1.txt" >"$ctrl/f1.out"
# Replace the original file, saving it
[ ! -f "$ctrl/f1.old" ] && mv -f "$ctrl/f1.txt" "$ctrl/f1.old"
mv -f "$ctrl/f1.out" "$ctrl/f1.txt"