120

UNIX(私の場合はCygwin)ソートユーティリティを使用してソートしようとしている固定幅フィールドファイルがあります。

問題は、ファイルの上部に 2 行のヘッダーがあり、ファイルの下部に並べ替えられていることです (各ヘッダー行はコロンで始まるため)。

ソートに「最初の2行をソートせずに渡す」か、コロン行を先頭にソートする順序を指定する方法はありますか-残りの行は常に6桁の数字で始まります(実際にはキーですそれが役立つ場合は、並べ替えています)。

例:

:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00

次のように並べ替える必要があります。

:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
4

12 に答える 12

149
(head -n 2 <file> && tail -n +3 <file> | sort) > newfile

括弧はサブシェルを作成し、stdout をラップして、単一のコマンドから来たかのようにパイプまたはリダイレクトできるようにします。

于 2013-01-28T13:03:00.027 に答える
98

を使用してもかまわない場合は、の組み込みのパイプ機能awkを利用できますawk

例えば。

extract_data | awk 'NR<3{print $0;next}{print $0| "sort -r"}' 

これは、最初の 2 行を逐語的に出力し、残りを にパイプしsortます。

これには、パイプされた入力の一部を選択的にソートできるという非常に具体的な利点があることに注意してください。提案されている他のすべての方法は、複数回読み取ることができるプレーンファイルのみをソートします。これは何でも動作します。

于 2014-03-09T11:54:32.897 に答える
45

パイプされたデータで動作するバージョンは次のとおりです。

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

ヘッダーに複数の行がある場合:

(for i in $(seq $HEADER_ROWS); do read -r; printf "%s\n" "$REPLY"; done; sort)

この解決策はここから

于 2014-12-08T23:11:14.613 に答える
8

使用できますtail -n +3 <file> | sort ...(tailは3行目からファイルの内容を出力します)。

于 2013-01-28T12:56:17.640 に答える
4
head -2 <your_file> && nawk 'NR>2' <your_file> | sort

例:

> cat temp
10
8
1
2
3
4
5
> head -2 temp && nawk 'NR>2' temp | sort -r
10
8
5
4
3
2
1
于 2013-01-28T13:13:10.150 に答える
3

2行のコードしか必要ありません...

head -1 test.txt > a.tmp; 
tail -n+2 test.txt | sort -n >> a.tmp;

数値データの場合、-n が必要です。アルファ ソートの場合、-n は必要ありません。

サンプルファイル:
$ cat test.txt

ヘッダー
8
5
100
1
-1

結果:
$ cat a.tmp

ヘッダー
-1
1
5
8
100

于 2015-02-01T21:05:31.393 に答える
0

これは、他の回答から派生したbashシェル関数です。ファイルとパイプの両方を処理します。最初の引数は、ファイル名または標準入力の「-」です。残りの引数は sort に渡されます。いくつかの例:

$ hsort myfile.txt
$ head -n 100 myfile.txt | hsort -
$ hsort myfile.txt -k 2,2 | head -n 20 | hsort - -r

シェル関数:

hsort ()
{
   if [ "$1" == "-h" ]; then
       echo "Sort a file or standard input, treating the first line as a header.";
       echo "The first argument is the file or '-' for standard input. Additional";
       echo "arguments to sort follow the first argument, including other files.";
       echo "File syntax : $ hsort file [sort-options] [file...]";
       echo "STDIN syntax: $ hsort - [sort-options] [file...]";
       return 0;
   elif [ -f "$1" ]; then
       local file=$1;
       shift;
       (head -n 1 $file && tail -n +2 $file | sort $*);
   elif [ "$1" == "-" ]; then
       shift;
       (read -r; printf "%s\n" "$REPLY"; sort $*);
   else
       >&2 echo "Error. File not found: $1";
       >&2 echo "Use either 'hsort <file> [sort-options]' or 'hsort - [sort-options]'";
       return 1 ;
   fi
}
于 2015-01-27T07:26:37.823 に答える
0

これは Ian Sherbin の回答と同じですが、私の実装は次のとおりです:-

cut -d'|' -f3,4,7 $arg1 | uniq > filetmp.tc
head -1 filetmp.tc > file.tc;
tail -n+2 filetmp.tc | sort -t"|" -k2,2 >> file.tc;
于 2016-03-05T07:56:53.253 に答える
-5
cat file_name.txt | sed 1d | sort 

これはあなたが望むことをします。

于 2016-03-09T12:22:07.103 に答える