我有一个制表符分隔文件,如果第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相等,则会发生这种情况.
awkawk 是工作的工具:
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自动处理细节.