使用bash

时间:2016-02-08 21:32:23

标签: bash awk sed grep

我需要对驻留在txt文件中的数据进行排序。样本数据如下:

======
Jhon 
Doe 
score -
------  
======
Ann 
Smith 
score + 
------
======
Will 
Marrow 
score - 
------

我只需要提取定义score +的部分。所以结果应该是

======
Ann 
Smith 
score + 
------

6 个答案:

答案 0 :(得分:2)

我会尝试这个:

$ grep -B3 -A1 "score +" myfile

这意味着... grep三行 B 之前和一行 A fter"得分+"。

答案 1 :(得分:1)

试试这个oneliner:

awk -v RS="==*" -F'\n' '{p=0;for(i=1;i<=NF;i++)if($i~/score \+/)p=1}p' file

使用给定的数据输出:

Ann 
Smith 
score + 
------

这个想法是,将所有行除以====...作为一个多行记录,并检查记录是否包含搜索模式,将其打印出来。

答案 2 :(得分:1)

Sed可以这样做:

package javafxapplication1;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class JavaFXApplication1 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

sed -n '/^======/{:a;N;/\n------/!ba;/score +/p}' infile ====== Ann Smith score + ------ 阻止打印,

-n

事情可能会更恰当地与/^======/ { # If the pattern space starts with "======" :a # Label to branch to N # Append next line to pattern space /\n------/!ba # If we don't match "------", branch to :a /score +/p # If we match "score +", print the pattern space } 相关联,但在行的末尾有空格,我不确定这些是真实的还是复制粘贴的文物 - 但这对于示例数据。

答案 3 :(得分:1)

使用GNU awk进行多字符RS:

$ awk -v RS='=+\n' '/score \+/' file
Ann 
Smith 
score + 
------

答案 4 :(得分:0)

假设:

$ echo "$txt"
======
Jhon 
Doe 
score -
------  
======
Ann 
Smith 
score + 
------
======
Will 
Marrow 
score - 
------

您可以在awk中创建一个切换类型匹配,以便仅打印您想要的部分:

$ echo "$txt" | awk '/^=+/{f=1;s=$0;next} /^score \+/{f=2} f {s=s"\n"$0} /^-+$/ {if(f==2) {print s} f=0}'
======
Ann 
Smith 
score + 
------

答案 5 :(得分:0)

使用Grep Context Flags

假设您有一个真正的固定格式文件,您可以使用 fgrep (或GNU或BSD grep 以及快速--fixed-strings标志) --before-context--after-context标志。例如:

$ fgrep -A1 -B3 'score +' /tmp/foo 
======
Ann 
Smith 
score + 
------

标志会找到你的匹配,并包括前面的三行和每次匹配后的一行。这为您提供了所需的输出,但复杂程度远低于sed或awk脚本。 YMMV。