1

.txtファイルの特定の文字に基づいてファイルを並べ替えたい。

これは私に与えられたファイルです:

12345678901234567890123456789012345
header     1stfoo   DDMMYYYY 2ndfoo
sltele     Hoodie   24051988 d12Hdq
sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   07082011 d08Hdq
sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   20041962 d14Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   13062002 d05Hdq

ご覧のとおり、DDMMYYY形式の日付を含む列があります。並べ替えると、 次のsort -n -k 3,3 thisfile.txt > sortedfile.txt結果が得られます。

sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   07082011 d08Hdq
sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   13062002 d05Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   20041962 d14Hdq
sltele     Hoodie   24051988 d12Hdq

しかし、私はこのような結果が欲しいです:

sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   20041962 d14Hdq
sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   24051988 d12Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   13062002 d05Hdq
sltele     Hoodie   07082011 d08Hdq

DDMMYYYY日付形式に基づく有効なsortedfile.txtとして。

somebadyは私を助けることができますか?

前もって感謝します

4

3 に答える 3

3

並べ替えコマンドを使用して、複数のキーとキーの開始終了位置を指定できます。

sort -n -k 3.8,3.12 -k 3.6,3.7 -k 3.4,3.5 < input_file

出力:

sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   24051988 d12Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   20042000 d14Hdq
sltele     Hoodie   13062002 d05Hdq
sltele     Hoodie   07082011 d08Hdq

ソートマンページから:

KEYDEFは、開始位置と停止位置のF [.C] [OPTS] [、F [.C] [OPTS]]です。ここで、Fはフィールド番号、Cはフィールド内の文字位置です。どちらも原点1です...フィールド内の文字は、前の空白の先頭から数えられます。

于 2012-07-20T04:42:22.600 に答える
1

受け入れられた回答は、行の先頭(によってカウントされた位置1)から数えて、特定の範囲の絶対文字位置でソートするという質問に実際には答えませんsort

の場合、フィールド番号はフィールド区切りsort文字で区切られたテキストの部分を指すことを覚えておくことが重要です。これは、 /オプションで変更しない限り、空白から空白への遷移です。行の先頭からカウントされる絶対文字位置の範囲でソートする正しい方法は、次のように、フィールド番号1から始まる文字をカウントすることです。-t--field-separator=SEP

sort -k 1.STARTPOS,1.ENDPOS

1.ENDPOSソートキーを行の終わりまで拡張する場合は、を省略できます。

フィールド番号を絶対的な文字位置と混同すると、驚くべき(そしてしばしば非常に苛立たしい)結果につながる可能性があります。

于 2015-04-25T17:33:05.777 に答える
0

これを行うためのより良い方法があることは知っていますが、これは私が過去に行ったことであり、ファイルを並べ替える必要はめったにありません。

sed -e 's/\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{4\}\)/\3\2\1/g' thisfile.txt | \
   sort -n -k 3,3 | \
   sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\3\2\1/g' > sortedfile.txt
于 2012-07-20T04:24:16.020 に答える