我有一个文本文件,结构如下:
text1;text2;text3;text4
...
我需要编写一个获得2个参数的脚本:我们要搜索的列和我们想要查找的内容。
因此,脚本应仅输出与列x(arg1)中找到的内容(arg2)匹配的行(整个行!)。
我尝试过egrep和sed,但我没有足够的经验来完成它。我很感激一些指导...
答案 0 :(得分:4)
鉴于您需要输出整行的附加信息,awk
最简单:
awk -F';' -v col=$col -v pat="$val" '$col ~ pat' $input
解释上述内容,-v
选项设置awk
变量,而无需担心引用awk
脚本正文中的问题。 awk
的前POSIX版本不会理解-v
选项,但会在没有它的情况下识别变量赋值。 -F
选项设置字段分隔符。在正文中,我们使用的是带有默认操作的模式(print
);该模式使用我们为-v
设置的变量用于列($
有awk
的“字段索引”运算符,而不是shell变量)和模式(和{{ 1}}确实可以拥有pat
式样的正则表达式。
答案 1 :(得分:1)
cat text_file.txt| cut -d';' column_num | grep pattern
它仅打印匹配的列而不是整行。让我想想是否有一个简单的解决方案。
答案 2 :(得分:1)
的Python
#!/usr/bin/env python
import sys
column = 1 # the column to search
value = "the data you're looking for"
with open("your file","r") as source:
for line in source:
fields = line.strip().split(';')
if fields[column] == value:
print line
答案 3 :(得分:0)
还有egrep
的解决方案。它不是一个非常漂亮但它有效:
egrep "^([^;]+;){`expr $col - 1`}$value;([^;]+;){`expr 3 - $col`}([^;]+){`expr 4 - $col`}$" filename
甚至更短:
egrep "^([^;]+;){`expr $col - 1`}$value(;|$)" filename
答案 4 :(得分:0)
grep -B1 -i "string from previous line" |grep -iv 'check string from previous line' |awk -F" " '{print $1}'
这将打印您的行。