Linux 複数列のソートと切り取り

Linux 複数列のソートと切り取り

「info」という名前の次のファイルがあります。

White:73:Mars:1543:Manuel
Green:17:Jupiter:1968:Sebastian
Blue:24:Venus:1970:Anna
Red:35:Neptune:1122:Javier
Yellow:135:Earth:1234:Raymond

植物と名前(ソート)のある列のみを使用してcut表示する必要があります。sortこれは私が次のようにする必要があることを意味します。

Earth:Anna
Jupiter:Javier
Mars:Manuel
Neptune:Raymond
Venus:Sebastian

試してみました cut -d: -f3,5 info | sort -t: -k1,1 -k2,2 が、最初の列だけが並べ替えられ、2番目の列は並べ替えられませんでした。

私もそれを試しましたが、2番目の列だけを並べ cut -d: -f3,5 info | sort -t: -k1,1 -k2,2 | sort -t: -k2,2 替えました。

すべての助けに感謝します。

答え1

列を個別に並べ替えます。

paste -d: <(cut -d: -f3 info | sort) <(cut -d: -f5 info | sort)
Earth:Anna
Jupiter:Javier
Mars:Manuel
Neptune:Raymond
Venus:Sebastian

答え2

結果は別々にソートされた2つのデータ列で構成されるため、sortそれぞれ別々のデータセットを持つ2回の呼び出しが必要です。

これネザブドカの答えプロセス置換を理解するシェルでこれを行う方法を示します。

paste -d : \
    <( cut -d : -f 3 info | sort ) \
    <( cut -d : -f 5 info | sort ) \
    >outfile

上記は出力をoutfile

プロセス置換を理解していないシェル(質問に特定のシェルを参照していない場合)では、中間ファイルを使用して2つのステップでこれを実行できます。

cut -d : -f 3 info | sort > outfile.tmp
cut -d : -f 5 info | sort | paste -d : outfile.tmp - >outfile
rm outfile.tmp

最初のパイプラインは、惑星のソート名の最初の列を生成します。ソートされたデータをファイルにリダイレクトしますoutfile.tmp。 2番目のパイプラインは、最初の列と同様に2番目の列を作成し、次をpaste使用して最初の列に追加します。次に中間ファイルを削除します。

答え3

使用そして組み込みの配列ソート機能なので、ファイル全体を一度だけ繰り返すだけです。

gawk '
  BEGIN { FS = OFS = ":" }
  {
    planet[NR] = $3
    name[NR] = $5
  }
  END {
    asort(planet)
    asort(name)
    for (i=1; i <= NR; i++) print planet[i], name[i]
  }
' info

答え4

step1: awk -F ":" '{print $3}' inpfile | sort -k1.1 >out.txt; awk -F ":" '{print $5}' inpfile |sort -k1.1 >out_1.txt

step2: paste -d ":" out.txt out_1.txt

出力

Earth:Anna
Jupiter:Javier
Mars:Manuel
Neptune:Raymond
Venus:Sebastian

関連情報