2014-10-27 105 views
1

我想從文件中刪除特定的字符串。 我嘗試使用:使用bash腳本從文件中刪除字符串

for line3 in $(cat 2.txt) 
do 
    if grep -Fxq $line3 4.txt 
     then 
     sed -i /$line3/d 4.txt 
    fi 
done 

我想這個代碼刪除4.txt行,如果他們也是2.txt,但這個循環將刪除所有4.txt線,我不知道爲什麼。有人能說出這段代碼有什麼問題嗎?

2.txt:

a 
ab 
abc 

4.txt:

a 
abc 
abcdef 
+0

您能否顯示一些來自'2.txt'和'4.txt'的示例數據? – anubhava 2014-10-27 20:10:51

+0

已添加示例數據。 – Bouncer00 2014-10-27 20:15:41

+0

只有sed! 'sed $(sed's,^,-e/^ ,; s,$,$/d,'2.txt)4。txt' – gboffi 2014-10-27 20:48:05

回答

1

您可以通過單一awk command做到這一點:

awk 'ARGV[1] == FILENAME && FNR==NR {a[$1];next} !($1 in a)' 2.txt 4.txt 
abcdef 

要存儲輸出回4.txt使用:

awk 'ARGV[1] == FILENAME && FNR==NR {a[$1];next} !($1 in a)' 2.txt 4.txt > _tmp && mv _tmp 4.txt 

PS:添加ARGV[1] == FILENAME &&負責處理空文件大小寫,如@pjh所示。

+1

如果第一個文件爲空,則不起作用:它不會生成輸出,但應該複製第二個文件中的所有行。有關該問題的詳細信息,請參閱[10 Awk提示,技巧和陷阱](http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/)中的'警告',以及如何修理它。 – pjh 2014-10-29 12:55:30

+0

謝謝@pjh:現在編輯好了。 – anubhava 2014-10-29 21:01:22

0

媽媽快看」,只用sed ...

sed $(sed 's,^, -e /^,;s,$,$/d,' 2.txt) 4.txt 
  1. 變換每一行2.txt在sed命令,例如,abc - >-e /^abc$/d
  2. 給sed命令的列表,以一個實例對4.txt sed的操作

要存儲輸出回4.txt使用:

sed -i $(sed 's,^, -e /^,;s,$,$/d,' 2.txt) 4.txt 

編輯:雖然我很喜歡的美學基礎我的回答,請不要嘗試 這個家!看到PJH評論下面的 許多方面的詳細理由在我microscript可能會失敗

+0

該解決方案有許多問題。如果第一個文件爲空,或者包含空格或包含斜槓,則失敗。如果第一個文件包含正則表達式元字符,它可能會生成錯誤的輸出。如果第一個文件非常大,則可能會導致命令由於時間太長而失敗。另外,如果第一個文件非常大,它可能會非常低效。 – pjh 2014-10-29 13:50:56

+1

@pjh我編輯了我的答案,以證明你的評論。我承認,我發佈了這個特殊的答案,因爲它的美麗(像往常一樣,美麗在旁觀者的眼中!),而不是它的用處...... – gboffi 2014-10-29 17:44:08

1
grep -F -v -x -f 2.txt 4.txt 

grep -Fvxf 2.txt 4.txt 

fgrep -vxf 2.txt 4.txt 
0

只需使用擊(4 )builtins:

declare -A found 
while IFS= read -r line || [[ $line ]] ; do found[$line]=1 ; done <2.txt 
while IFS= read -r line || [[ $line ]] ; do 
    ((${found[$line]-0})) || printf '%s\n' "$line" 
done <4.txt 

'[[$ line]]'測試用於處理未終止行的文件。

如果任何輸出行以'echo'選項開頭,則使用'printf'而不是'echo'。