ロジックに基づくテキストファイルのソート

ロジックに基づくテキストファイルのソート

1行に1000文字の文字列を含む.txtファイルがあり、ファイルに数百万行があります。クライアントの新しい要件は、次のロジックに従ってファイルをソートすることです。よろしくお願いします。私はUnixに初めてアクセスし、フォーラムで解決策を見つけることができません。

キャラクタ位置6~11が「CIP002」の場合、キャラクタ位置13~21に従って並べ替えられる。文字位置6~11が「CIP003」の場合、位置20~28の文字に応じて並べ替えられる。

並べ替える前に

00001CIP002_123456789ABCDEFJ
00002CIP002_123456790EFGHIJK
87654CIP003_ABCDEFJ123456789
87655CIP003_EFGHIJK123456790

ソート後

00001CIP002_123456789ABCDEFJ
87654CIP003_ABCDEFJ123456789
00002CIP002_123456790EFGHIJK
87655CIP003_EFGHIJK123456790

答え1

とても簡単です。 python/awk/perl/bash/whatever を使用して CIP{2,3} ビジネスロジックをコーディングし、パイプラインを設定します。

次の出力ストリームが必要です。

$ cat two_column.txt
123456789 00001CIP002_123456789ABCDEFJ
123456790 00002CIP002_123456790EFGHIJK
123456789 87654CIP003_ABCDEFJ123456789
123456790 87655CIP003_EFGHIJK123456790

通常の方法でソートし、後処理ステップでこのプレフィックスを削除します。

$ cat two_column.txt | sort | awk '{print $2}'  > result.txt

答え2

awk救助に来てください;)

gawk '$1 ~ /.{5}CIP002_.*/ {print substr($0, 13, 9)" "$0}
$1 ~ /.{5}CIP003_.*/ {print substr($0, 20, 9)" "$0}' before.txt | sort | awk '{print $2}'

一緒にする必要がありますgawk

説明する:

  • gawk '$1 ~ /.{5}CIP002_.*/ {print substr($0, 13, 9)" "$0} $1 ~ /.{5}CIP003_.*/ {print substr($0, 20, 9)" "$0}' yourfile.txt
    • $1 ~ /.{5}CIP002_.*/フィルタは以下に準拠していますCIP002
      • .{5}最初の5文字と一致します。
      • 続いてCIP002_
      • その後にランダムな文字列が続きます。
    • print substr($0, 13, 9)" "$0データの整列部分を最初の列に印刷することです。
      • substr($0, 13, 9)文字 13 から文字 21 まで行を切り捨てる
      • 123456789この命令は、最初の列、スペース、データの順に印刷します。

出力サンプル:

123456789 00001CIP002_123456789ABCDEFJ
123456790 00002CIP002_123456790EFGHIJK
123456789 87654CIP003_ABCDEFJ123456789
123456790 87655CIP003_EFGHIJK123456790
  • | sort:生成された出力を、sort最初の列のみでソートするコマンドのパイプにリダイレクトします。

出力サンプル:

123456789 00001CIP002_123456789ABCDEFJ
123456789 87654CIP003_ABCDEFJ123456789
123456790 00002CIP002_123456790EFGHIJK
123456790 87655CIP003_EFGHIJK123456790
  • | awk {print $2}:列の並べ替えなしでデータのみを印刷する

出力サンプル:

00001CIP002_123456789ABCDEFJ
87654CIP003_ABCDEFJ123456789
00002CIP002_123456790EFGHIJK
87655CIP003_EFGHIJK123456790

答え3

2つのアプローチは次のとおりです。

ソートキーを前に追加し、ソート後に削除します。

<your-file awk '{
  print substr($0,6,6) == "CIP002" ? substr($0,13,9) : substr($0,20,9), $0}' |
    sort -k1,1 |
    cut -d ' ' -f 2-

または、ソートキーの前にトークンを挿入します。

<your-file perl -pe '
  substr($_, substr($_,5,6) eq "CIP002" ? 12 : 19, 0) = "|"' |
  sort -t '|' -k2,2.9 |
  tr -d '|'

|入力で何も起こらないと仮定)。

タイは、sortライン全体を語彙的に比較する最終比較によって解決されます。

関連情報