並べ替えますが、ヘッダー行を一番上に保つ

並べ替えますが、ヘッダー行を一番上に保つ

まず、列ヘッダーの束である行を生成してから、データ行の束を生成するプログラムから出力を取得しています。この出力の個々の列を切り取り、個々の列に基づいてソートされていることを確認したいと思います。ヘッダーがない場合は、列のサブセットを-k選択または確認して、切り取りと並べ替えを簡単に実行できます。ただし、このソート方法は列ヘッダーを残りの出力行と混在させます。タイトルを一番上に保つ簡単な方法はありますか?sortcutawk

答え1

Andyのアイデアを盗んで、使いやすくするために関数に変換します。

# print the header (the first line of input)
# and then run the specified command on the body (the rest of the input)
# use it in a pipeline, e.g. ps | body grep somepattern
body() {
    IFS= read -r header
    printf '%s\n' "$header"
    "$@"
}

今できます:

$ ps -o pid,comm | body sort -k2
  PID COMMAND
24759 bash
31276 bash
31032 less
31177 less
31020 man
31167 man
...

$ ps -o pid,comm | body grep less
  PID COMMAND
31032 less
31177 less

答え2

bashを使用して、次のようにタイトルを一番上に保持できます。

command | (read -r; printf "%s\n" "$REPLY"; sort)

またはPerlにしてください:

command | perl -e 'print scalar (<>); print sort { ... } <>'

答え3

私が見つけたawkの良いバージョンスクリプトでうまく動作します。

awk 'NR == 1; NR > 1 {print $0 | "sort -n"}'

答え4

コマンドはpee以下から来ます。その他のユーティリティこのタイプの作業のために特別に設計されています。

例:

ヘッダー行を保持して2番目(数字)列を並べ替えるには、次の手順を実行しますstdin

<your command> | pee 'head -n 1' 'tail -n +2 | sort -k 2,2 -n'

説明する:

pee:stdin を 1 つ以上のコマンドにパイプし、結果を連結します。

head -n 1:標準入力の最初の行を印刷します。

tail -n +2:標準入力から2行目と次行を印刷します。

sort -k 2,2 -n:2番目の列の数字でソートします。

テスト:

printf "header\na 1\nc 3\nb 2\n" | pee 'head -n 1' 'tail -n +2 | sort -k 2,2 -n'

与えられた

header
a 1
b 2
c 3

関連情報