awk를 사용하여 #의 두 번째 열과 나머지 텍스트를 인쇄합니다.

awk를 사용하여 #의 두 번째 열과 나머지 텍스트를 인쇄합니다.

내 구성 파일에 다음 줄이 있습니다.

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

awk두 번째 열도 나열 #하고 싶습니다 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이는 먼저 각 행의 두 번째 필드를 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

논리는 동일하지만 출력에서는 두 개의(왼쪽 정렬) 필드 각각에 20자를 할당하고 그 사이에 탭 문자를 배치합니다(좋은 측정을 위해).

답변2

GNU 기능을 활용하여 줄부터 줄 match()끝까지 일치시킵니다.awk#

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

match()함수는 두 번째 매개변수의 정규 표현식과 일치하는 패턴으로 세 번째 매개변수에 제공된 배열을 채웁니다.

모든 POSIX에서 awk의 세 번째 매개변수는 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

관련 정보