web-dev-qa-db-fra.com

Comment obtenir la première colonne de sortie de communication?

J'essaie donc d'obtenir la première colonne de sortie de communication en utilisant awk. J'ai lu que Tab était utilisé comme séparateur pour la communication, alors j'ai fait:

awk -F"\t" '{print $1}' comm-result.txt

Avec comm-result.txt contenant la sortie de:

comm -3 file1 file2

Mais cela ne semble pas fonctionner.

Cette recommandation prend également le caractère espace comme séparateur et j'obtiens des résultats étranges lorsque mes fichiers contiennent plusieurs espaces.

Comment puis-je obtenir uniquement la première colonne de comm?

27
Daddou

"Donc j'essaye d'obtenir la première colonne de sortie de communication"

La première colonne du "comm file1 file2 "La sortie contient des lignes propres à file1. Vous pouvez ignorer le post-traitement en appelant simplement comm avec -2 (supprime les lignes uniques à file2) et -3 (supprime les lignes qui apparaissent dans les deux fichiers).

comm -2 -3 file1 file2   # will show only lines unique to file1

Cependant, si vous n'avez pas d'autre choix que de traiter une sortie pré-exécutée de comm, alors comme Carl a mentionné , cut serait une option:

cut -f1 comm-results.txt

Cependant, cela entraîne des lignes vides pour les cas où la colonne 1 est vide. Pour y faire face, awk peut être plus approprié:

awk -F"\t" '{if ($1) print $1}' comm-results.txt
     ----    ----------------
      |                     |
   Use tab as delimiter     |
                            +-- only print if not empty
32
Shawn Chin

cut(1) est probablement un meilleur choix que awk pour ce problème.

7
Carl Norum

Vous pouvez utiliser comm avec -2 et -3 (comme déjà expliqué ci-dessus ), ou utilisez comm avec grep comme:

grep -o '^\S\+' <(comm file1 file2)

de sorte que la sortie ne contiendra aucun espace de fin. Ceci est utile pour les commandes non_comm.

3
kenorb