「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