
osxシェルでこれらの行を含むストリームが与えられると、最初のトークンはキーであり、行の最初の文字は常に一致し、残りのトークンは常に数字だけで、その数字は可変であり、単一の[a-z]
スペースのみを区別します。トークン:
key [1] [...] [n]
---- --------------------
key1 17 89 52
key2 5 189 6 3 5 21
交換を繰り返し実行せずに、次の出力(各行のトークン数とは無関係)をどのようにエクスポートできますか?
17 key1
89 key1
52 key1
5 key2
189 key2
6 key2
3 key2
5 key2
21 key2
(キーと数字を変更したり、各行をスペースで区切ったりするのではなく、改行文字を使用してくださいkey1 17 key1 89 key1 52
。
現在、sed
キーがない次の番号ごとに連続置換を使用していますが、これは非効率的であり、最大トークン数よりも多くの回数をパイプする必要があるため、増加するsed
可能性があります(そうでなければここにある理由を推測します)。 ?):
sed -E 's/^([a-z][^ ]*) ([0-9]+) /\2 \1\n\1 /g' filename.txt | sed ... | sed ...
私がそれについて掘り下げる時間があれば、awk
これがうまくいくと確信しています。おそらく、cut
タスクを実行したりトークンを効率的に使用したりできる他のツールの1つです。
コードと処理時間の点でこれを効率的に実行するにはどうすればよいですか?
答え1
これを達成するためにawkを使用することができます
awk '{ for(i = 2; i <= NF; i++) { print $i,$1; } }' file
forループは2番目のフィールドから最後のフィールドに移動し、各フィールドを印刷し、最初のフィールドを追加します。
答え2
sed
これに適しています。 sed コードを少しだけ調整すると、次のような結果が得られます。
sed -E '
s/^([a-z][^ ]*) ([0-9]+)/\2 \1\n\1/
/\n/P;D
' filename.txt
出力:
17 key1
89 key1
52 key1
5 key2
189 key2
6 key2
3 key2
5 key2
21 key2
説明する:
- あなたは私があなたから受け取った代替s / / /コマンドをすでに知っています
global /g flag
。 。 - デフォルトのアイデアは、最初の2つの要素を見て、反転する前に最初の要素のコピーを保存し(反転する前に)、反転操作後に改行文字を入力して、パターンスペースからまで印刷するコマンドを
\n
使用できるようにすることです。P
最初の改行文字。 P
/\n/
無限ループを防ぐには、aと定義します。D
パターンスペースの最初の改行文字とパターンスペースの残りの部分を削除して、コントロールをスクリプトの先頭に戻します。 IOW、あなたがやっていることは、暗黙のループメカニズムを提供することです。- 現在の行のループは、パターン空間が最終的に連続したプロセスによって消費されると終了します
s/// --- P --- D --- s/// --- P --- D ...........
。 - その後、
sed
新しい読書サイクルを開始すると、何が期待されるのかがわかります。... HTH。