2

我有一堆以下格式的文件。

一个.txt

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

每个文件至少有 3 行以XXX. 现在,对于每个文件,A.txt我想将所有行写入到 file 的第 3 次出现XXX(在上面的示例中是直到前一行still more textA_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 回答