
カスタムモードでファイルの内容を出力する方法はありますか?
myfile
たとえば、次の内容を含むファイルがあります。
a
d
b
c
..次のパターンを使用してソートする方法:最初に「b」で始まる行を印刷し、次に「d」で始まる行を印刷してから、通常のアルファベット順に行を印刷するので、予想される出力は次のようになります。
b
d
a
c
答え1
データを容量を超えてソートする必要がある場合、sort
一般的な方法はデータを前処理し、前にソートキーを追加してソートし、最後に重複ソートキーを削除することです。たとえば、ここで0
行が始まる場合はb
aを追加し、行が始まる1
場合はd
aを追加し、2
そうでない場合はaを追加します。
sed -e 's/^b/0&/' -e t -e 's/^d/1&/' -e 't' -e 's/^/2/' |
sort |
sed 's/^.//'
これにより、すべてとb
行がd
並べ替えられます。行を元の順序で維持するには、最も簡単な方法は次のとおりです。ソートされていない行を分割します。。ただし、元の行をソートキーに変換できますが、nl
ここではより複雑です。 (\t
sedがこの構文を理解していない場合は、タブ全体をリテラルタブに置き換えてください。)
nl -ba -nln |
sed 's/^[0-9]* *\t\([bd]\)/\1\t&/; t; s/^[0-9]* *\t/z\t0\t/' |
sort -k1,1 -k2,2n |
sed 's/^[^\t]*\t[^\t]*\t//'
または、カスタムソート機能を簡単に指定できるPerl、Python、Rubyなどの言語を使用してください。
perl -e 'print sort {($b =~ /^[bd]/) - ($a =~ /^[bd]/) ||
$a cmp $b} <>'
python -c 'import sys; sys.stdout.write(sorted(sys.stdin.readlines(), key=lambda s: (0 if s[0]=="b" else 1 if s[0]=="d" else 2), s))'
b
または、合計行の元の順序を維持したい場合d
:
perl -e 'while (<>) {push @{/^b/ ? \@b : /^d/ ? \@d : \@other}, $_}
print @b, @d, sort @other'
python -c 'import sys
b = []; d = []; other = []
for line in sys.stdin.readlines():
if line[0]=="b": b += line
elif line[0]=="d": d += line
else: other += line
other.sort()
sys.stdout.writelines(b); sys.stdout.writelines(d); sys.stdout.writelines(other)'
答え2
単純なコマンド以上の機能を使用する必要がありますsort
。行が最初にgrep
並べ替えb
られ、次にd
行がb
並べ替えられ、最後にまたは記号がないすべての項目が並べ替えられます。d
grep '^b' myfile > outfile
grep '^d' myfile >> outfile
grep -v '^b' myfile | grep -v '^d' | sort >> outfile
cat outfile
結果は次のとおりです。
b
d
a
c
これは行が "pattern"で始まると仮定しますb
。d
みんなパターンや 1 行内の他の内容では、キャレット ( ^
) を省略できます。
1行に対応する内容は次のとおりです。
(grep '^b' myfile ; grep '^d' myfile ; grep -v '^b' myfile | grep -v '^d' | sort)
答え3
この問題を解決する1つの方法awk
は次のとおりです。
sort myfile | awk '$0 ~ /^b/ || $0 ~ /^d/ {print} $0 !~ /^b/ && $0 !~ /^d/ { a[f++] = $0 } END { for (word = 0; word < f; word++) { print a[word] } }'
答え4
grep ソリューションに加えて、ファイルの履歴があり、コマンドを保持したい場合は、次のものを使用できます。パラメータあなたが電話する場所grep。いくつかのデータを含むファイル(custom_sort.txt)があるとしましょう。
ccc
aaa
xxx
nnn
そして、追加情報を含むソートされたgrepファイル(sorted-data.txt)を検索しようとしています。
aaa info
bbb test
ccc warn
...
mmm test
nnn info
...
xxx warn
単にgrepすると、次のような結果が出力されます。
aaa info
ccc warn
nnn info
xxx warn
ソースファイルなどのデータを並べ替えるには、次の手順を実行する必要があります。
cat custom_sort.txt | xargs -l1 -I KEY grep KEY sorted-data.txt
出力は次のとおりです。
ccc warn
xxx warn
aaa info
nnn info