CSV ファイルはソートされますが、ヘッダーはソートされません。

CSV ファイルはソートされますが、ヘッダーはソートされません。

CSVファイルをソートする必要がありますが、ヘッダー行(最初の行)は引き続きソートされます。これが私が使用するものです:

cat data1.csv | sort -t"|" -k 1 -o data1.csv 

以下は例示的な行です。

Name|Email|Country|Company|Phone 
Brent Trujillo|[email protected]|Burkina Faso|Donec LLC|(612) 943-0167

答え1

これは機能し、次に出力されますdata2.csv

head -n 1 data1.csv > data2.csv &&
tail -n +2 data1.csv | sort -t "|" -k 1 >> data2.csv

答え2

私の考えでは、問題の大部分が

... -k 1 ...

sort彼らの-k主張は少なくとも-k [num] スタート そして ,[num] 終わりそれぞれに固有の参照があります。実際、-k 1これはソートキーをまったく指定しないものと変わりません。なぜなら、閉じる参照がないと、行は行sortの最初から最後までソートされるからです。

sort最初の区切りフィールドのみを|ラップするには、次の操作を行う必要があります。

... -k1,1 ...

これをして最初の行にスタートその後、|GNUを使用すると、sort次のことができます。

sort -st\| -k1,1 <infile >outfile

...最初の行はそのまま残ります。希望の動作を得ることができます。

POSIXは1行のすべてのバイト計算をsort指定するので、上記でGNUを指定しました。sort比較にとって重要-u一意でない操作sortですべてのソートキーを使用した後(2回 - 最初のパスの後に少なくとも削除修飾子が割り当てられた隣接する同じキー行)そして隣接する同じ結合ラインを維持しなさい。これは次のことを意味します。

printf '|%s\n' 9 1 | sort -nk1,1

...POSIXをsort印刷中...

|1
|9

-k...最初のフィールド(すべての引数に一致する唯一のフィールド)が完全に空であるため、直観に反することができます。デフォルトでは、GNUsortも同じ内容を印刷しますが、-sテーブルソートオプションを指定すると印刷されます。

|9
|1

...テーブルの並べ替えのために重複するエントリを削除するのでは-uなく、一意の並べ替えと同じ方法でコマンドラインで指定されたフィールドで許可されている行以上を評価しないためです。-s

ファイルをまったく変更せず、ヘッダー行が最初の行でソートにGNUを使用している場合は、sort次のことができます。

{ printf \|; cat file; } | 
sort -st\| -k1,1 | 
sed 's/.//;q'

...私の考えでは、標準出力から必要な結果を得ることができるようです。

それともそうです...

{ printf \|; cat file; } | 
nl -ba -s\| |
sort -t\| -k2,2 -k1n,1 |
cut -d\| -f2-

...どの実装でも同じです。

関連情報