awkを使用して、#の2番目の列と残りのテキストを印刷します。

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

awk2番目の列もリスト#したいですawk

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

それを取得する方法がわからない#
好ましい出力は、キーの後にコメントテキストが続くことです。

$mod+F2 Open terminal 

答え1

$ 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文字を割り当て、それらの間にタブ文字を配置します(良い測定のため)。

答え2

GNU機能を活用して行から行末までmatch()一致させます。awk#

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

このmatch()関数は、2番目のパラメータの正規表現と一致するパターンで3番目のパラメータに指定された配列を埋めます。

すべてのPOSIXでawkの3番目のパラメータはmatch()次のとおりです。いいえサポートされていますが、表示するRSTARTいくつかの特殊変数がありますRLENGTHスタートそして長さ一致するグループ。substr()一致する文字列を取得するには、現在の行でこの関数を使用します。

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

printf()出力をきれいに印刷するには、他の回答の機能を使用できます。

答え3

これは簡単ですsed。データは実際にはフィールド指向ではないので、awkはここで大きな利点を提供しません。

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

翻訳する:

s/^[^ ]* //

最初の空白文字の前のすべての項目を削除します。

s/ .*#//

行の最初の(残りの)空白文字から最後の文字まで#すべての項目を削除します。

答え4

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

関連情報