
すべての専門家
同じディレクトリに2種類のファイルがあります
例1)Record1.txt(レコード2、レコード3、レコード4...)
11111 absda qwedc
11112 uiyds dqeds
11113 eqwev jfsec ...
ex2)Summary1.txt(要約2、要約3、要約4...)
----some data is written----
.....
.....
***RESULT 111.114 30.344 90.3454*** OTHERNUMBER#1 OTHERNUMBER#2 .....
.....
.....
私がしたいことは抽出です。結果X(数値) Y(数値) Z(数値)要約#.txtレコード。その後、その場所をそのレコード#.txtに配置し、次のようにいくつかの情報を追加したいと思います。
X Y Z
111.114 30.344 90.3459
11111 absda qwedc
11112 uiyds dqeds
11113 eqwev jfsec ...
したがって、最終ファイルRecord#.txtを上に表示したいと思います。私はsedとcatを試しましたが、どちらも失敗しました。
よろしくお願いします!
答え1
私が正しく理解した場合、私の提案は次のとおりです。
for i in record*.txt; do
xyz=$(grep -oP "(?<=RESULT ).*(?=\*\*\*)" $i)
sed -i "1 iX Y Z\n$xyz\n" summary${i//record/}
done
名前付きファイルを繰り返します。record*.txt
for i in record*.txt; do
RESULT
との間の文字列をキャプチャします。***
xyz=$(grep -oP "(?<=RESULT ).*(?=\*\*\*)" $i)
ファイルの最初の行にXYZを追加し、その後にキャプチャされたパターンを追加します。summary*.txt
sed -i "1 iX Y Z\n$xyz\n" summary${i//record/}
答え2
これは、固定テキストを含む行()X Y Z
と1つのファイルの単一行の一部(SummaryX.txt
)、および関連ファイル名を持つ別のファイルの完全な内容()recordX.txt
を単純に関連付けたものです。
#!/bin/sh
for sfile in Summary*.txt; do
rfile="$(echo "$sfile" | sed -e 's/^Summary/record/')"
ofile="$rfile.new"
{
echo X Y Z
sed -E -n -e 's/^.*RESULT ([0-9.]+ [0-9.]+ [0-9.]+).*/\1/p' "$sfile"
echo
cat "$rfile"
} > "$ofile"
# uncomment the following to replace the original record file with the new one.
# mv -f "$ofile" "$rfile"
done
どのシェルを使用しているかを指定していないため、bash関連の文字列操作やその他の機能を使用しません。 sh互換シェルと一緒に使用する必要があります。
recordX.txt.new
この行のコメントを外さないと、出力が保存されますmv
。これにより、要件を満たしていることを確認できます。今後元の入力ファイルが破損しています。潜在的に破壊的なタスクを実行するときは、常にバックアップコピーを処理する必要があります。
$ cat record1.txt.new
X Y Z
111.114 30.344 90.3454
11111 absda qwedc
11112 uiyds dqeds
11113 eqwev jfsec ...