簡體   English   中英

用Shell腳本中的另一個文本文件中的值替換特定行?

[英]Replace specific rows with values from another text file in shell scripting?

我有一個文件,它是8行的單星號。 我有4個文本文件,每個文件有兩行數字。 我想為每個文本文件創建一個新文件,其中行號i + 2和i + 3被文本文件的內容替換。 例如:

File1將是:

1 5 7 8  
2 4 5 6  

我想將其轉換為:

1 5 7 8  
2 4 5 6  
*  
*  
*  
*  
*  
*  

File2將轉換為:

6 5 6 7  
8 9 0 9  

至:

*  
*  
6 5 6 7  
8 9 0 9  
*  
*  
*  
*  

有沒有辦法遍歷目錄中的文本文件,像上面那樣轉換每個文本文件?

謝謝!

更新:也許這會更好地解釋它:

基本上我有n個文本文件,每個文本文件只有兩行數字。 我想循環瀏覽文本文件,將每個文本文件轉換為另一個文本文件,其中行數為nx 2,第一個文本文件的值占行1和2,其余行為*。 第二個文本文件將具有nx 2行,但是第3和第4行是文件值,其余為*。 第三個文件具有nx 2行,第6和第7行使用其值填充,其余為*,依此類推。

不知道如何在shell中輕松地做到這一點,但是GNU awk具有一些使其非常簡單的功能。

parse.awk

BEGINFILE { 
  outfile = ARGV[ARGIND] ".new"
  for(i=1; i<ARGIND; i++)
    print "*\n*" > outfile
} 

{ print > outfile }

ENDFILE { 
  for(i=1; i<ARGC-ARGIND; i++) 
    print "*\n*" > outfile
  close(outfile)
}

像這樣運行它:

gawk -f parse.awk File*

說明

ARGV是一個數組,其中包含輸入文件的名稱。 ARGIND是ARGV到當前正在處理的文件的索引,ARGC是ARGV的長度,即給定的參數數。

BEGINFILE和ENDFILE塊在開始/結束文件處理時執行,因此它們很方便。

bash解決方案:

n=8
i=0
for file in * ; do 
    { 
        for ((a=0 ; a<n ; a++)) ; do
            ((a==i)) && cat "$file"
            echo $'*\n*'
        done
    } > "$file".out
    let i++
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM