grep或awk - 如果第1列和第3列具有相同的值,如何返回行

0 perl awk grep

我有一个制表符分隔文件,如果第1列中的值与第3列中的值相同,我希望输出在我的文件中包含整行.对于perl和linux的知识非常有限,这就像我来的那样接近解决方案.

文件示例

Apple   Sugar   Apple    
Apple   Butter  Orange   
Raisins Flour   Orange   
Orange Butter  Orange   
Run Code Online (Sandbox Code Playgroud)

结果将是:

Apple Sugar Apple   
Orange Butter Orange
Run Code Online (Sandbox Code Playgroud)

码:

#!/bin/sh  

awk '{    
    prev=$0; f1=$1; f3=$3;    
    getline    
    if ($1 == $3) {    
        print prev    
        print    
    }'    
} myfilename    
Run Code Online (Sandbox Code Playgroud)

我相信有一个更简单的解决方案.甚至可能是命令行上的grep或awk.但那是我能找到的唯一能够给我解决方案的代码.

谢谢!

Fat*_*ror 10

这很简单awk:

awk '$1 == $3' myfile
Run Code Online (Sandbox Code Playgroud)

默认操作是打印出记录,因此如果字段1和3相等,则会发生这种情况.

  • 同样在Perl中:`perl -lane'print如果$ F [0] eq $ F [2]'myfile` (5认同)
  • +1这是正确的解决方案(一旦你添加'-F'\ t'`).@ user2795815不要使用任何grep解决方案,因为它们会因某些输入值而加密失败.例如,尝试使用2行输入文件,其中第一行是"a good a",第二行是"a bad aa"(根据您的要求以制表符分隔). (2认同)

Jon*_*ler 5

运用 awk

awk 是工作的工具:

awk '$1 == $3'
Run Code Online (Sandbox Code Playgroud)

如果数据中的字段严格按制表符分隔并且可能包含空格,则需要明确指定字段分隔符:

awk -F'\t' '$1 == $3'
Run Code Online (Sandbox Code Playgroud)

(其中The \t表示一个选项卡;您可能必须键入Tab(或甚Control-VTab至)以将其放入字符串中).

运用 grep

你可以这样做grep,但你不想这样做grep:

grep -E '([A-Za-z]+)\t[A-Za-z]+\t\1'
Run Code Online (Sandbox Code Playgroud)

正则表达式的关键部分是\1"与第一个捕获的字符串相同的值".

你甚至可能会经历这样的旋转bash:

grep -E $'([A-Za-z]+)\t[A-Za-z]+\t\\1'
Run Code Online (Sandbox Code Playgroud)

您可以通过注意(假设)字段中没有空格来简化生活:

grep -E '([A-Za-z]+)[[:space:]]+[A-Za-z]+[[:space:]]+\1'
Run Code Online (Sandbox Code Playgroud)

正如其中一条评论中所指出的那样,我没有$在搜索模式的末尾添加一个; 这是可行的(尽管必须清理数据以包含制表符和删除尾随空白),以便不会拾取"Good Noise GoodBad".还有其他方法可以做到这一点,你可以使正则表达式越来越复杂,以处理更多可能的情况.但那些只是强调awk解决方案更好; awk自动处理细节.