Command-Line

管道 sed 到 grep 似乎沒有按預期工作

  • February 6, 2017

我有 2 個文件:

$ cat file1  
jim.smith  
john.doe  
bill.johnson  
alex.smith  

$ cat file2   
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321      
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976     
"1/30/2017 11:14:03 AM",New customer,john.doe,CA,1485771243  
"1/30/2017 11:13:53 AM",New customer,bill.smith,CA,1485771233  

我想從 file2 中獲取 file1 中不存在的所有名稱。

以下不起作用:

$ cut -d, -f 3 file2 | sed 's/"//g' | grep -v file1  
jim.smith  
tim.jones  
john.doe  
bill.smith  

為什麼 grep -v 的管道在這種情況下不起作用?

這實際上是我回答您之前的問題的最後一步。

您的解決方案有效,如果您在-f前面添加:file1``grep

$ cut -d, -f3 file2 | grep -v -f file1
tim.jones
bill.smith

使用-f,grep將查找file1模式。沒有它,它將簡單地file1用作文字模式。

您可能還想使用-F,否則模式中的點將被解釋為“任何字元”。當你在它的時候,把它放在-x那里以便在整條線上進行匹配(如果你有一個不應該匹配的內容,這grep將很有用):joe.smith``joe.smiths

$ cut -d, -f3 file2 | grep -v -F -x -f file1

顯然,這要求在行尾沒有尾隨空格file1(問題的文本中似乎有)。

請注意,sed不需要,因為 的輸出cut不包含任何". 此外,如果您需要刪除 all ",那麼tr -d '"'將是一個更好的工具。

引用自:https://unix.stackexchange.com/questions/342704