次のような状況があるかどうかを考えてみましょう。
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)は、1行のデータのみを含む別々のファイルです。
重複した質問の場合は、解決するようご案内ください。
コードを試してみました。
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"