2013-01-08 83 views
1

我有一个包含多列的文件。我正试图过滤出在前两个字段中具有相同值的 记录。这两个字段都保存文本值。这 是我使用的命令:基于字符串比较的过滤

cat input_file | awk -F'\t' '{if($1==$2) print $1 $2}' 

当我运行这个命令我得到的只有那些行,其中在字段中的值 数字。该文件包含几个行,这两个行在两个不是数字的 字段中具有相同的值。我如何强制awk进行字符串比较?

另外,有没有其他办法可以做到这一点? (我是新来的Unix envionment 不知道太多的技巧......希望得到咨询)如果要过滤掉所有,其中前两列是相同的只是做awk '$1!=$2' file作为awk使用空白行

+3

AWK做可以读取文件本身的例子。 http://partmaps.org/era/unix/award.html –

+2

与'=='比较时,awk不应该关心字符串/数字。当我尝试运行你的命令时,它适用于我(字符串以及数字)。你确定这些行是用制表符分隔的吗?也许你可以这样做:'hexdump -C your-file'。 0x09 ==选项卡和0x20 ==空间。 – emil

+0

谢谢!问题在于分离器。实际的分隔符不是标签,而是一个很长的字符序列(为了避免混淆,已经将它改为tab)。显然,序列有一个我错过了的尾部空间。 – Aadith

回答

2

作为默认字段分隔符,并且它的默认操作是打印。

$ cat file 
1  1  col3 line1 
two  two  col3 line2 
three 3  col3 line3   
four4 four4 col3 line4 

$ awk '$1!=$2' file 
three 3  col3 line3   

$ awk '$1==$2' file 
1  1  col3 line1 
two  two  col3 line2 
four4 four4 col3 line4 

字段类型是无关紧要的,使用cat是没有必要的。

0

你实际上正在做的正确,除了你已经添加-F'\t'这是你的问题。 在awk中字段分隔符FS的默认值是一个包含单个空格的字符串,“”。因此您需要删除-F'\t'

为如见下文:

> cat temp 
1  1 random text 
some some random text 
some more random text 


> nawk '{if($1==$2){print}}' temp 
1  1 random text 
some some random text 

> nawk -F'\t' '{if($1==$2){print}}' temp 
> 

我还不确定为什么第二个命令没有工作。但肯定的一点是,你需要删除-F

0

我正在通过sudo_O

[[email protected] ~]$ cat s 
1  1  col3 line1 
two  two  col3 line2 
three 3  col3 line3   
four4 four4 col3 line4 
[[email protected] ~]$ cat s | perl -lane '$F[0] == $F[1] && print' 
1  1  col3 line1 
two  two  col3 line2 
four4 four4 col3 line4 
+2

Perl也可以单独读取输入文件。 – tripleee

+0

是的,对.. perl单行本身可以将文件作为输入 – Suku