基于字符串比较进行过滤

时间:2013-01-08 09:24:51

标签: bash awk cygwin

我有一个包含多列的文件。我正在尝试过滤掉有记录的记录 前两个字段中的值相同。这两个字段都包含文本值。这个 是我正在使用的命令:

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

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

此外,还有其他方法可以实现这一目标吗? (我是Unix环境的新手 并且不知道太多的伎俩...会很感激建议)

3 个答案:

答案 0 :(得分:2)

如果要过滤掉前两列相同的所有行,只需执行awk '$1!=$2' fileawk使用空格作为默认字段分隔符,默认操作为print。

$ 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

答案 1 :(得分: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

答案 2 :(得分:0)

我以sudo_O

为例
[sgeorge@sgeorge-ld ~]$ cat s
1       1        col3   line1
two     two      col3   line2
three   3        col3   line3           
four4   four4    col3   line4
[sgeorge@sgeorge-ld ~]$ cat s | perl -lane '$F[0] == $F[1] && print'
1       1        col3   line1
two     two      col3   line2
four4   four4    col3   line4