2016-12-02 60 views
0

的第一和最後一排我有一個表是這樣的:的Unix - 返回一個類似的值

1000 2000 Ally 
1001 2001 Ally 
1002 2002 Ally 
1003 2003 Ally 
2000 4000 Kate 
2010 4010 Kate 
2020 4020 Kate 
3000 9000 Lisa 

我想它返回第一個和最後一行時,第3列具有相同的值。在這種情況下,它會返回:

1000 2000 Ally 
1003 2003 Ally 
2000 4000 Kate 
2020 4020 Kate 
3000 9000 Lisa 

反正使用awk/sed/grep做到這一點的?謝謝。

回答

2

使用awk

NR == 1 {first=last=$0; key=$3 } 
$3 == key {last=$0} 
$3 != key {print first; if(first != last) print last; 
      first=last=$0; key=$3} 
END  {print first; if(first != last) print last} 

作品我對你的數據集

不是在評論 上別的

每@詹姆斯 - 布朗的請求,測試它打印的DUP

版本
NR ==1 {print; key=$3 } 
$3 == key {last=$0} 
$3 != key {print last "\n" $0; key=$3} 
END  {print last} 

(可能還有別的東西g下其他數據)

+0

如果'Lisa'有兩次,它只會被打印一次。 –

+1

在我的系統上,你是不正確的。如果Lisa出現兩次(使用不同的行值)Lisa被打印兩次 – tomc

+0

我的不好,我應該說_ _具有相同的values_。我不應該在早餐之前這樣做...... –

1

你可以使用這個簡單的awk 1班輪打印1日和最後一個記錄的第三列的每個不同的值:

awk '!arr[$3] {arr[$3]=$0; if(prevline) print prevline; print} {prevline=$0}' file 

關聯數組在這種情況下,一個很大的幫助。

採樣運行:

$ cat file 
1000 2000 Ally 
1001 2001 Ally 
1002 2002 Ally 
1003 2003 Ally 
2000 4000 Kate 
2010 4010 Kate 
2020 4020 Kate 
3000 9000 Lisa 
$ awk '!arr[$3] {arr[$3]=$0; if(prevline) print prevline; print} {prevline=$0}' file 
1000 2000 Ally 
1003 2003 Ally 
2000 4000 Kate 
2020 4020 Kate 
3000 9000 Lisa 
+0

如果列表中間只有一次值,它將打印兩次。 – jas

+0

如果第一個記錄鍵(Ally)只存在一次,則會打印兩次。如果最後一個記錄鍵(Lisa)存在多次,它只會被打印一次。 –

0

我不能想出什麼聰明,它們似乎都失效的一種方式或其他。我責怪TGIF但讓我們去這一個:

$ awk '{ 
      if($3 in first) 
       last[$3]=$0; 
      else 
       first[$3]=$0 
     } 
     END { 
      for(i in first) 
       print first[i] ((i in last)?ORS last[i]:"") 
     }' file # | sort -k3 -k1 
2000 4000 Kate 
2020 4020 Kate 
3000 9000 Lisa 
1000 2000 Ally 
1003 2003 Ally 

缺點是,交易將不會是相同的原始文件,但可以用sort保存。最重要的是匹配記錄不必在源文件中彼此相鄰。

相關問題