0

我有一个制表符分隔的文件,如果第 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。但那是我能找到的唯一似乎给我解决方案的代码。

谢谢!

4

3 回答 3

10

这很容易awk

awk '$1 == $3' myfile

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

于 2013-09-19T14:51:26.897 回答
5

使用awk

awk是工作的工具:

awk '$1 == $3'

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

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

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

使用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'

正如其中一条评论所指出的,我没有$在搜索模式的末尾添加 a ;这将是可行的(尽管必须清理数据以包含制表符并删除尾随空格),因此不会拾取“好噪音好坏”。还有其他方法可以做到这一点,您可以使正则表达式变得越来越复杂以处理更多可能的情况。但那些只是强调awk解决方案更好;awk自动处理细节。

于 2013-09-19T15:01:34.007 回答
2

使用grep

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

于 2013-09-19T14:56:15.670 回答