web-dev-qa-db-ja.com

通信出力の最初の列を取得する方法は?

したがって、awkを使用してcomm出力の最初の列を取得しようとしています。 Tabがcommのセパレータとして使用されたことを読んだので、次のようにしました。

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

以下の出力を含むcomm-result.txtを使用

comm -3 file1 file2

しかし、これはうまくいかないようです。

この表彰では、区切り文字としてスペース文字も使用します。ファイルに複数のスペースが含まれていると、奇妙な結果になります。

commから最初の列のみを取得するにはどうすればよいですか?

27
Daddou

「だから、通信出力の最初の列を取得しようとしています」

comm file1 file2」出力の最初の列には、file1に固有の行が含まれています。 -2file2に固有の行を非表示)および-3(両方のファイルに表示される行を非表示)でcommを呼び出すだけで、後処理をスキップできます。

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

ただし、commの事前実行出力を処理する以外に選択肢がない場合は、 Carl言及 のように、cutがオプションになります。

cut -f1 comm-results.txt

ただし、これにより、列1が空の場合は空行になります。これに対処するには、おそらくawkがより適切かもしれません。

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

cut(1) は、おそらくこの問題に対してawkよりも良い選択です。

7
Carl Norum

comm-2および-3とともに使用することができます( 既に説明済み として)、またはcommgrepとともに使用する場合:

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

そのため、出力には末尾のスペースが含まれません。これは、comm以外のコマンドに役立ちます。

3
kenorb