1

単一のアスタリスクが 8 行あるファイルがあります。4 つのテキスト ファイルがあり、それぞれに 2 行の数値が含まれています。行番号 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 個のテキスト ファイルがあり、それぞれに 2 行の数字しかありません。テキスト ファイルを循環させ、各テキスト ファイルを nx 2 行の別のテキスト ファイルに変換します。最初のテキスト ファイルの値は行 1 と 2 を占め、残りの行は *. 2 番目のテキスト ファイルには nx 2 行が含まれますが、3 番目と 4 番目の行はファイルの値で、残りは *. 3 番目のファイルには nx 2 行があり、6 番目と 7 番目の行には値が入力され、残りは * などです。

4

2 に答える 2

1

シェルでこれを簡単に行う方法はわかりませんが、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 ブロックは、ファイルの処理の開始/終了時に実行されるため、これらは便利なフックです。

于 2012-11-02T14:57:10.200 に答える
0

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
于 2012-11-02T15:30:39.597 に答える