GNU/Linux >> Linux の 問題 >  >> Linux

テキスト内の数字が連続していない場合に記号を追加する (または単に改行を追加する) 方法

grep の使用 または sed これを行うため、grep としては推奨されません 数えられず、sed 本当に難しい あらゆる種類の算術演算を実行できます (正規表現ベースのカウントである必要があり、熱心な人を除いて、ほとんどの人にとって初心者ではありません)。

$ awk -F '[<>]' '{ while ($2 >= ++nr) print "---"; print }' file
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
---
A_D2<6>
---
---
A<9>
A_D2<10>
---
---
A<13>

awk コードは 0 を想定しています 最初の番号である必要があり、wanted を維持します 変数 nr の現在の行の行番号 . 1 行または数行の挿入が必要な数値が入力から読み取られる場合、これは while によって行われます。 ループ (これも nr をインクリメントします) 変数)

<...> の数字 < を指定することで解析されます と > フィールド区切り文字として使用する必要があります。数値は $2 になります (2 番目のフィールド)。


これはおそらく効率的とは言えません...

$ tr '<' '\t' < testfile | tr '>' ' ' \
  | awk '{ while (NR + shift <= $2) { print "-----"; shift++ }; print }' \
  | tr '\t' '<' \
  | tr ' ' '>'
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>

まず、tr を使用します ファイルからタブで区切られた 2 つのフィールドを取得します。

次に、tr を使用します そうしないと awk コマンドが失敗するため、もう一度「>」をスペースに置き換えます:-/

ここら辺の専門家は笑ってしまうでしょう :-)

第三に、awk -command は、処理された行数を 2 番目のフィールドと比較します。行数が少ない場合、マーカーを出力して shift を増やします これは、前の比較の行数に追加されます。

4 番目と 5 番目:以前 tr で行った変更を取り消しています .

https://unix.stackexchange.com/a/190707/364705 からインスピレーションを得ました


私は awk ではありません 男、しかしこれもそれを行うようです。私は常に改善を受け入れています:

awk -F '[<>]' -v num=0 '
{
  while(num < $2) {
    print "----";
    num++
  }
  print $1"<"$2">"
  num++
}' file

最初に、フィールドセパレーターを文字 < に一致するように設定します および > 、したがって、各行はこれらの文字で分割されます。たとえば、最初の行は $1=A に割り当てられます と $2=0 .

次に、変数 num=0 を設定します .行カウンターとして使用します。現在の行の番号が $2 の場合 行カウンターより大きい場合、---- を出力します 、両方の値が等しくなるまでカウンターの繰り返しをインクリメントします。次に $1<$2> を出力します カウンターをインクリメントします。


Linux
  1. Vimの各行の先頭にテキストを挿入する方法

  2. インストールしたばかりのパッケージは正当ですか?そうでない場合はアンインストールする方法はありますか?

  3. 一部のポートがNmapによって報告され、他のポートはフィルタリングされないのはなぜですか?

  1. Unix シェルで数値の列を合計する

  2. 行番号または ASCII テーブルなしで hexdump から 16 進値のみを出力する方法は?

  3. ネットワークにないデバイスの MAC アドレスを取得する方法

  1. ファイルの最後に改行を追加するにはどうすればよいですか?

  2. Gnomeウィンドウマネージャーにアプリケーションを追加するにはどうすればよいですか?

  3. ZshのPs1の改行記号は何ですか?