2017-04-06 24 views
0

我有兩個文件,FileA和文件B.文件A包含所有的數據。文件B包含我想要在文件A中找到的感興趣的序列。我正在使用的實際文件中有超過6000行。grep行從另一個文件中列出一個文件,然後打印上面的序列

文件:

Name1 
Apples 
Name2 
Pears 
Name3 
Pears 
Name4 
Grapes 
Name5  
Apples 

文件B:

Apples  
Pears 

我想寫一個UNIX命令或Python腳本,讓我只打印感興趣的序列上方的線。

我已經使用這個命令嘗試:

grep -B 1 -f FileB FileA | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }' 

,但我得到了下面的列表中沒有任何方式的名稱爲蘋果和梨

Name1 
Name5  
Name2 
Name3 

我想什麼來區分是一樣的東西這個:

Apples  
Name1  
Name5  
Pears 
Name2  
Name3  

然後我需要這個列表成爲這樣的東西:

Apples >Name 1, Name 5 
Pear > Name 2, Name 3 

我對編程非常陌生,任何建議都會很棒!

+1

您可能想要更改您的問題:命令的grep部分工作正常。這是'awk'命令不符合你的期望。事實上,看看你想要什麼樣的最終輸出,我甚至不會用'grep'或'awk'來打擾,我會直接去Python和它的[fileinput](https://docs.python)。 org/3/library/fileinput.html)庫。 – user2926055

+0

在** awk **腳本中,您只是忽略了打印觸發打印的水果名稱。至於Python,你還沒有做任何嘗試,所以我們無法幫助你處理你的代碼。 – Prune

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [在主題](http://stackoverflow.com/help/on-topic)和[如何提問](http://stackoverflow.com/help/how-to-ask)適用於此處。 StackOverflow不是一個設計,編碼,研究或教程服務。 – Prune

回答

0

輸入FILEA,一些sed代碼變換流成fruit Name#N格式,然後datamash崩潰它字段#2,和一個grep只輸出所需的行:

sed -n 'h;n;G;s/\n/ /p' < FileA | datamash -W -s -g1 collapse 2 | grep -f FileB 

輸出:

Apples Name1,Name5 
Pears Name2,Name3 
+0

謝謝,這真的很有幫助。我不得不改變命令,因爲它打印了一半的名字,因爲它們之間有空格,但是這很好用!謝謝! – Ellie

+0

@Ellie,請看看:[接受答案:它是如何工作的?](https://meta.stackexchange.com/a/5235/334345)我還注意到OP數據中的尾部空格,但不確定這些人是否屬於原始數據,因此在回答之前刪除了這些空間。很高興它解決了。 – agc

0
cat B.txt | xargs -III sh -c \ 
       'echo II "\> "; grep II A.txt -B1 | grep -v "\-\-" | grep -v II ' 

做這項工作。

蘋果

名1

NAME5

名稱2

NAME3

之後,您可以使用sed將姓名與號碼分開。

0

因爲它似乎你已經熟悉的awk,爲什麼不嘗試對整個工作的簡單awk的片段:

$ awk 'NR==FNR{a[$1]=(!a[$1]?prev:a[$1]", "prev);prev=$1;next}$1 in a{print $1" > "a[$1]}' fileA fileB 
Apples > Name1, Name5 
Pears > Name2, Name3 

讓我知道你是否需要詳細解釋這段代碼。

相關問題