簡體   English   中英

如何僅打印包含第三列的行(Linux)

[英]How Do I Print only the lines that contain the third column(Linux)

我在文本文件中有以下幾行,但只想選擇/打印第三列中的那些行:

SUBSCRIBERIDENTIFIER|234908743|
SUBSCRIBERIDENTIFIER|234909544|
SUBSCRIBERIDENTIFIER|234809956|5008596|   
SUBSCRIBERIDENTIFIER|234809201|
SUBSCRIBERIDENTIFIER|234908513|
SUBSCRIBERIDENTIFIER|234818667|2000010|
SUBSCRIBERIDENTIFIER|234817353|
SUBSCRIBERIDENTIFIER|234817553|
SUBSCRIBERIDENTIFIER|234818966|5008611|   
SUBSCRIBERIDENTIFIER|234817611|2000010|   
SUBSCRIBERIDENTIFIER|234817511|
SUBSCRIBERIDENTIFIER|234909292|

輸出是這樣的:

SUBSCRIBERIDENTIFIER|234809956|5008596|   
SUBSCRIBERIDENTIFIER|234818667|2000010|
SUBSCRIBERIDENTIFIER|234818966|5008611|   
SUBSCRIBERIDENTIFIER|234817611|2000010|

我已經嘗試過此命令,但未產生期望的結果:

cat DEF01_resultBB.txt | grep "SUBSCRIBERIDENTIFIER"|$3 

嘗試這個:

$ grep -E '^([^\|]+\|){3} *$' DEF01_resultBB.txt
SUBSCRIBERIDENTIFIER|234809956|5008596|
SUBSCRIBERIDENTIFIER|234818667|2000010|
SUBSCRIBERIDENTIFIER|234818966|5008611|
SUBSCRIBERIDENTIFIER|234817611|2000010|

正則表達式功能非常強大,您可以在這里嘗試: https : //regex101.com/r/NZB5GZ/1

請注意,您的某些行的末尾有多余的空格,因此表達式的末尾是<space>*


grep -E表示將模式解釋為擴展的正則表達式,這就是我們在此處所擁有的。 如果您有GNU grep ,也可以使用--extended-regexp

按要求構建正則表達式:

  • [^\\|]匹配方括號內列出的字符以外的任何字符,因此排除|
    • [...]匹配里面的任何字符
    • [^...]匹配不在里面的任何字符
    • | 在某些情況下在正則表達式中具有特殊含義,因此,如果您要使用文字| -從技術上講,在此情況下(方括號中)
  • [^\\|]+匹配上述一次或多次
  • [^\\|]+\\| 匹配不包含管道但以管道結尾的任何字符串
  • ([^\\|]+\\|)產生上述匹配組-對於下一步很重要
  • ([^\\|]+\\|){3}與上面的正好3次匹配
  • ([^\\|]+\\|){3} *匹配上面的內容,后跟零個或多個空格
    • 重要,因為您的某些行最后有多余的空格
  • ^([^\\|]+\\|){3} *$使用^$錨,將表達式分別綁定到行的開頭和結尾

將字段分隔符設置為| 並僅輸出包含四列的行(第四列為空)。

awk -F '|' 'NF==4' file

輸出:

SUBSCRIBERIDENTIFIER|234809956|5008596|   
SUBSCRIBERIDENTIFIER|234818667|2000010|
SUBSCRIBERIDENTIFIER|234818966|5008611|   
SUBSCRIBERIDENTIFIER|234817611|2000010|

您可以使用awk做到這一點:

awk -F '|' '/SUBSCRIBERIDENTIFIER/ && $3' DEF01_resultBB.txt

或grep:

grep 'SUBSCRIBERIDENTIFIER|.*|.*|' DEF01_resultBB.txt

根據輸入的內容,對SUBSCRIBERIDENTIFIER過濾是多余的,因為它出現在所有行中,因此您可以將上述內容縮短為

awk -F '|' '$3' DEF01_resultBB.txt

grep '|.*|.*|' DEF01_resultBB.txt

分別。

或者你可以數| 字符,並且只有包含3個字符的輸出行:

perl -ne 'print if tr/|// == 3' DEF01_resultBB.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM