Linux

從 txt 文件中提取一些文本並添加到現有文件 bash

  • August 22, 2019

所有專家

我在同一個目錄中有兩種類型的文件

ex1) record1.txt (record2, record3, record4 …)

11111 absda qwedc
11112 uiyds dqeds
11113 eqwev jfsec ...

ex2)Summary1.txt(Summary2,Summary3,Summary4​​ …)

----some data is written---- 
.....
.....
***RESULT 111.114 30.344 90.3454***  OTHERNUMBER#1 OTHERNUMBER#2 ..... 
.....
.....

我要做的就是提取Summary#.txt 的RESULT X(number) Y(number) Z(number)。然後,把這些位置放到對應的record#.txt中,但是我想添加一些資訊,像這樣

X Y Z
111.114 30.344 90.3459

11111 absda qwedc
11112 uiyds dqeds
11113 eqwev jfsec ...

所以,我希望我的最終文件 record#.txt 可以在上面查看。我試過 sed 和 cat ……都失敗了。

提前致謝!

如果我理解正確,這是我的建議:

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/}

這只是具有固定文本的行 ( X Y Z) 和來自一個文件的單行的一部分 ( 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

你還沒有說你正在使用哪個 shell,所以它不使用任何 bash 特定的字元串操作或其他功能。它應該適用於任何與 sh 兼容的 shell。

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 ...

引用自:https://unix.stackexchange.com/questions/536729