awkを使用して2列目と残りのテキストを#

構成ファイルに出力します

bindsym $mod+F2 exec gnome-terminal #Open terminal bindsym $mod+p exec command /some/path" #Popup Dictionary bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser 

2番目の列と#の後にあるものをawk削除したいと思います。 awk

awk "/bindsym/{print $2}" filename 

として使用しています


推奨される出力は、キーとコメントテキストです。

$mod+F2 Open terminal 

回答

$ awk -v OFS="\t" "/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser 

これは、awkを使用して、最初に各行の2番目のフィールドを抽出しますbindsymで始まり変数keyに入ります。次に、行の#までのすべてを削除し、keyと行の残りの部分を次のようにタブで出力します。区切り文字。

代替出力フォーマット:

$ awk "/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser 

ロジックは同じですが、出力は2つのそれぞれに20文字を割り当てます(左寄せ)フィールドとその間にタブを配置します(適切な測定のため)。

回答

ivの使用#から行末までの部分に一致するGNU awkのid = “b2b5f2c3bd”>

関数

awk "/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}" filep 

match()関数は、3番目の引数で提供された配列に、2番目の引数の正規表現からの一致したパターンを入力します。

どのPOSIX awkでも、match()の3番目の引数はサポートされていません 、ただし、いくつかの特別な変数RSTARTRLENGTHは、一致したグループの開始長さをマークします。現在の行でsubstr()関数を使用して、一致する文字列を取得します

awk "/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}" file 

出力をきれいに印刷するには、他の回答と同じようにprintf()関数を使用できます。

回答

これはsedで行うのは非常に簡単です。データは実際にはフィールド指向ではないため、Awkはここでは大きなメリットを提供しません:

sed "s/^[^ ]* //;s/ .*#//" inputfile 

翻訳:

s/^[^ ]* // 

最初のスペース文字までのすべてを削除します。

s/ .*#// 

最初の(残りの)スペース文字からすべてを削除します。行の最後の#文字まで。

回答

Step1: count=`awk "{print NR}"|sed -n "$p" filename` Step2:for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" output for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser 

コメント

  • I ' mには、4行以上ある可能性があると想定しています入力ファイル。ターミナルで行番号を印刷する以外に最初のステップが何をするかは明確ではありません。
  • コードを修正する
  • コードを修正する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です