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