2013-01-08 82 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