So erhalten Sie Zeilen, deren n-te Spalte die m-te Spalte enthält

9

Ich habe eine CSV-Datei, die Domains und Webmails enthält, wie folgt:

site1.com,mail.site1.com
site2.com,testmail.com
site3.com,mx.site3.com
site4.com,smtp.site4.com
site5.com,foomail.com
site6.com,barmail.com
site7.com,webmail.site7.com
site8.com,01mx.site8.com
site9.com,foobarmail.com
site10.com,mx-smtp222.site10.com

Ich möchte Zeilen erhalten, in denen die Webmails-Spalte die Domains-Spalte derselben Zeile enthält. Für das obige Beispiel sollte die Ausgabe sein:

site1.com,mail.site1.com
site3.com,mx.site3.com
site4.com,smtp.site4.com
site7.com,webmail.site7.com
site8.com,01mx.site8.com
site10.com,mx-smtp222.site10.com
alrz
quelle

Antworten:

11

Mit awk:

awk -F, '$2 ~ $1"$"' file.csv
  • -F, Setzt das Feldtrennzeichen auf ,

  • $2 ~ $1"$"prüft, ob das zweite Feld mit dem ersten Feld endet; Wenn ja, drucken Sie den Datensatz (Standardaktion).


Mit grep, grepstandardmäßig drucken nur die gefundenen Zeilen:

grep -E '^([^,]+),.*\1$' file.csv

Mit sedDruckzeilen, die der Bedingung entsprechen:

sed -nE '/^([^,]+),.*\1$/ p' file.csv

Beispiel :

% cat file.txt
site1.com,mail.site1.com
site2.com,testmail.com
site3.com,mx.site3.com
site4.com,smtp.site4.com
site5.com,foomail.com
site6.com,barmail.com
site7.com,webmail.site7.com
site8.com,01mx.site8.com
site9.com,foobarmail.com
site10.com,mx-smtp222.site10.com

% awk -F, '$2 ~ $1"$"' file.txt
site1.com,mail.site1.com
site3.com,mx.site3.com
site4.com,smtp.site4.com
site7.com,webmail.site7.com
site8.com,01mx.site8.com
site10.com,mx-smtp222.site10.com

% grep -E '^([^,]+),.*\1$' file.txt
site1.com,mail.site1.com
site3.com,mx.site3.com
site4.com,smtp.site4.com
site7.com,webmail.site7.com
site8.com,01mx.site8.com
site10.com,mx-smtp222.site10.com


% sed -nE '/^([^,]+),.*\1$/ p' file.txt 
site1.com,mail.site1.com
site3.com,mx.site3.com
site4.com,smtp.site4.com
site7.com,webmail.site7.com
site8.com,01mx.site8.com
site10.com,mx-smtp222.site10.com
heemayl
quelle