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

时间:2013-09-19 14:48:27

标签: perl awk grep

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

文件示例

Apple   Sugar   Apple    
Apple   Butter  Orange   
Raisins Flour   Orange   
Orange Butter  Orange   

结果将是:

Apple Sugar Apple   
Orange Butter Orange

代码:

#!/bin/sh  

awk '{    
    prev=$0; f1=$1; f3=$3;    
    getline    
    if ($1 == $3) {    
        print prev    
        print    
    }'    
} myfilename    

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

谢谢!

3 个答案:

答案 0 :(得分:10)

使用awk

很容易
awk '$1 == $3' myfile

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

答案 1 :(得分:5)

使用awk

awk是工作的工具:

awk '$1 == $3'

如果数据中的字段是严格标签分隔的并且可能包含空格,那么您需要明确指定字段分隔符:

awk -F'\t' '$1 == $3'

\t表示标签;您可能需要输入标签(甚至 Control-V 标签 )将它放入字符串中。)

使用grep

您可以使用grep执行此操作,但不希望使用grep执行此操作:

grep -E '([A-Za-z]+)\t[A-Za-z]+\t\1'

正则表达式的关键部分是\1,这意味着'与第一个捕获的字符串具有相同的值。

你甚至可以在bash

中进行这样的旋转
grep -E $'([A-Za-z]+)\t[A-Za-z]+\t\\1'

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

grep -E '([A-Za-z]+)[[:space:]]+[A-Za-z]+[[:space:]]+\1'

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

答案 2 :(得分:2)

使用grep

grep -P "([^\t]+)\t[^\t]+\t\1" inFile