このコマンドの出力をファイルに保存したとしましょう。
cat /dev/urandom | tr -dc '[:graph:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?\1)//g' | head -n 50
ファイル内の各行の最初のn文字のみを比較し、これらの文字の最初のインスタンスを含む最初の行のみを返したいと思います。
たとえば、ファイルを並べ替えずにファイルの各行の最初の4文字を表示したいとします。各行で4つの文字列のうちの最初のインスタンスを見つけ、最初のインスタンスを含む行だけを印刷したいと思います。
各行に4、5、6文字が表示されるようにコマンドを変更できる場合は、ありがとうございます。
あなたの時間と助けに心から感謝します。私は本当にこれを理解しようとしてきました。
MelBurslan、文字列の内容は関係ありませんが、上記のコマンドの出力(現在修正済み)は英語のキーボードに入力できるすべての文字です。以下は 2 つの例の行です。
k!>d#&)"EtXN`;*9TaD7BcL84z5[y{$Q?_Y%fCw6F0Vgn\|]ImqR.:1l<^}u'+Ms/hjS@e~2vxWO(3,bJiprP-=UAZGoHK 3'O$#Eg5&,`l>vn491M"cVZR\7J.H[XTw*:q}Kz8hf;W_P|i<6@CAytF^Dmkb]GBsU+{Y?xje%oIQ-~r!2Sap=/)N0du(L
Glenn、はい、4つの文字列/キー/トークンの最初のインスタンス。また、必要に応じて文字マッチングを操作できるように、マッチングを変更できる必要があります。
ワイルドカード、うまく動作します。ありがとうございます。
thrig、非常にうまく動作します。ありがとうございます。
答え1
仮説あなたの質問に関するGlenn Jackmanの説明awk
そうですね。以下を使用するソリューションは次のとおりですsubstr()
。
awk '{key = substr($0,1,4)}; !(key in printed); {printed[key]}' file
これは、「key」を行の最初の4文字に設定し、以前にキーを見たことがない限り、行を印刷し、キーが印刷されたことを追跡します。
答え2
ハッシュを使用しますか?
% (echo foo; echo bar; echo foobar) \
| perl -ne '/(.{3})/; print unless $seen{$1}++'
foo
bar
%