2

次の形式のファイルがたくさんあります。

A.txt :

some text1      
more text2    
XXX
more text  
....  
XXX
.  
.  
XXX 
still more text  
text again  

各ファイルには、.で始まる行が少なくとも 3 行ありXXXます。ここで、各ファイルについてA.txt、3番目に出現するまでのすべての行を書き込みたいXXX(上記の例では、前の行までstill more text)を fileに書き込みますA_modified.txt

これをbashで実行したいのですがgrep -n -m 3 -w "^XXX$" * | cut -d: -f2、各ファイルで対応する行番号を取得することを思いつきました。

headこれらの行番号と一緒に使用して、必要な出力を生成することは可能ですか?

PS: 単純な python スクリプトでうまくいくことはわかっていますが、特に理由もなくこの bash でやろうとしています。

4

2 に答える 2

3

より簡単な方法は、 を使用することawkです。現在の作業ディレクトリに目的のファイルしかないと仮定して、次を試してください。

for i in *; do awk '/^XXX$/ { c++ } c<=3' "$i" > "$i.modified"; done

または、ファイルが非常に大きい場合:

for i in *; do awk '/^XXX$/ { c++ } c>=3 { exit }1' "$i" > "$i.modified"; done
于 2013-02-10T02:04:32.507 に答える
2

head -n は、ファイルの最初の「n」行を出力します

#!/bin/sh

for f in `ls *.txt`; do
  echo "searching $f" 

  line_number=`grep -n -m 3 -w "^XXX$" $f | cut -d: -f1 | tail -1` 

  # line_number now stores the line of the 3rd XXX 

  # now dump out the first 'line_number' of lines from this file
  head -n $line_number $f
done
于 2013-02-10T01:41:49.830 に答える