
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
ライン全体を語彙的に比較する最終比較によって解決されます。