2013-10-19 25 views
12

我想將符合特定格式的行從文件1移動到文件2。類似於操作切割和從一個文件粘貼到另一個在Windows從一個文件移動匹配一個文件到另一個文件的行

比方說,我想從文件1切方含bar所有行並將其粘貼到新創建的文件2

輸入:

文件1

bla foo bla 
bla bar bla 
bla aaa bla 
bla bar bla 
bla foo bla 
處理後

所需的輸出:

文件1

bla foo bla 
bla aaa bla 
bla foo bla 

文件2

bla bar bla 
bla bar bla 

我已經試過

grep將創建所需文件2但不修改文件1

grep 'bar' file1 > file2 

sed -i修改所需文件1但不建立文件2

sed -i '/bar/d' file1 

如果我執行命令,都一個接一個,我得到預期的結果。但在這裏,我正在尋找一個單行命令出於好奇,並使腳本更簡潔。

您的幫助,將不勝感激。

+0

爲什麼'-1'?沒有意見?這樣做的人應該展示如何在投票前用單線命令解決這個問題! – jkshah

+0

投票結束,但沒有提供任何理由或評論?!這太多了。 – jkshah

回答

10

這可能會爲你工作(GNU SED):

sed -i -e '/bar/{w file2' -e 'd}' file1 

一種替代方案:

sed -i -e '/bar/w file2' -e '//d' file1 
+0

它做到了!用'{}'神奇地使用'w'和'd'。非常感謝.. – jkshah

1

您可以在兩個命令之間放置一個&&以使它們成爲單行。但是這不會更具可讀性,所以我不建議你這樣做。

要在一個命令中執行相同的操作,您需要一些可以就地編輯文件的東西,刪除不需要的行,並將這些行打印到stdoutstderr,以便將其重定向到另一個文件。 也許ed可以做到這一點,但我不知道該怎麼寫。 我不認爲有另一個「標準」的UNIX工具來做到這一點。

順便說一句,切&粘貼實際上有3個步驟:

  1. 將選定文本複製到剪貼板
  2. 從原始文件
  3. 粘貼剪貼板到新文件中刪除

的兩步UNIX命令沒有剪貼板。

4

您可以使用並選擇基於在比賽正則表達式的不同的文件句柄打印時:

perl -i.bak -ne 'BEGIN { open $oh, q|>|, pop or die } { print { m/bar/ ? $oh : q|ARGVOUT| } $_ }' file1 file2 

它產生:

==> file1 <== 
bla foo bla 
bla aaa bla 
bla foo bla 

==> file2 <== 
bla bar bla 
bla bar bla 
+0

感謝您的回覆。不幸的是,以下錯誤沒有成功:'不能將file1重命名爲file1.bak:文本文件繁忙,跳過文件。'我認爲它正在嘗試在處理時修改'file1'。我想知道它是如何工作的,以及我的系統出了什麼問題! – jkshah

+1

你在使用什麼操作系統。我看到這個錯誤消息在Linux下運行,但是當文件位於虛擬機箱共享文件系統上時。 – justintime

+0

@justintime這是非常真實的。我在虛擬盒子上嘗試使用Ubuntu!現在嘗試獨立系統,它的工作!非常感謝。 – jkshah

2

awk腳本將這樣的伎倆:

awk '{a[NR]=$0}END{for(i=1;i<=NR;i++)print a[i] > "file"(a[i]~/bar/?2:1)}' file1 

輸出:

$ cat file1 
bla foo bla 
bla aaa bla 
bla foo bla 

$ cat file2 
bla bar bla 
bla bar bla 
+0

太棒了!訣竅了。我縮短了一下'awk'{print $ 0>($ 0〜/ bar /?「file2」:「file1」)}'file1'。非常感謝! – jkshah

+0

不知道你爲什麼創建'a [i]'。簡單的'$ 0'爲我工作。我錯過了什麼嗎? – jkshah

0

我喜歡其他的答案,但只是一個(明顯)替代的情況下,方法你擔心在你的模式中犯了一個錯誤,並想要一個簡單的方法來回滾:

grep 'bar' file1 > file2 
grep -v 'bar' file1 > file3 

一旦你滿意你的結果(提示:的tee代替>將讓你看到什麼獲取寫入到文件):

mv file3 file1 

一般來說,我喜歡的perl做替代像上面的回答,但是當正則表達式變得太複雜,並且你半盲目地複製和粘貼你不明白的命令時,你無法掌控寶貴的數據。

相關問題