2012-12-09 46 views
2

我的文本文件按字母順序排序。我想確定每行是否包含在以下行中,如果是,請刪除兩行中的第一行。因此,舉例來說,如果我有...sed:如何確定第1行是否包含在第2行

car 
car and trailer 
train 

...我想結束了......

car and trailer 
train 

我找到了 「的sed單行」 頁面(S) ,該代碼具有搜出雙線的代碼:

sed'$!N; /^(.*)\n\1$/!P; D'

...我想刪除^會做伎倆,但它沒有。

(這也將是不錯的與非連續的線條要做到這一點,但我的文件運行到千行,它可能會採取一個腳本數小時或數天,跑。)

+0

忽略案例會是一個優點。 – user1889034

+0

由於您的RE在末尾包含'$'符號,這意味着* line1完全匹配line2 *而非* line1包含在line2中* –

+0

作爲相關建議,爲什麼我們不簡單地編寫幾條python行來完成此任務? – sleepsort

回答

2

原命令

sed '$!N; /^\(.*\)\n\1$/!P; D' 

尋找準確的線匹配。由於您想檢查第一行是否包含在第二行中,因此您需要添加一些通配符:

sed '$!N; /^\(.*\)\n.*\1.*$/!P; D' 

應該這樣做。

+0

沒有:我的樣品,'echo $'cat \ ncat和dog \ nhouse \ nmoney \ ngold和money \ n'',這個印刷品'房子'也是。 –

+0

呃。感謝編輯傢伙。在我的手機上,我只是從OP中複製了cmd,沒有發現缺失的大括號。 :) – TheRuss

+0

@ F.Hauri房子應該打印下面它不包含房子的線。 – TheRuss

0

你說:

這也將是不錯的與非連續的行做到這一點。

這裏是一個bash腳本,以除去包含在另一行中,不一定是連續的,不區分大小寫的所有短行:

#!/bin/bash 
# sed with I and Q are gnu extensions: 
cat test.txt | while read line; do 
    echo Searching for: $line 
    sed -n "/.$line/IQ99;/$line./IQ99" test.txt # or grep -i 
    if [ $? -eq 99 ]; then 
     echo Removing: $line 
     sed -i "/^$line$/d" test.txt 
    fi 
done 

測試:

$ cat test.txt 
Boat 
Car 
Train and boat 
car and cat 

$ my_script 
Searching for: Boat 
Removing: Boat 
Searching for: Car 
Removing: Car 
Searching for: Train and boat 
Searching for: car and cat 

$ cat test.txt 
Train and boat 
car and cat 
+0

這是非常有幫助的!謝謝你們! – user1889034

2

sed的是一個極好的工具在單行上進行簡單替換,其他任何只是使用awk:

awk '$0 !~ prev{print prev} {prev=$0} END{print}' file 
相關問題