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 

Answer

$ 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 자 ( 왼쪽 정렬) 필드와 그 사이에 탭을 넣습니다 (좋은 측정을 위해).

답변

iv #에서 줄 끝까지 일치시키는 GNU awk의 id = “b2b5f2c3bd”>

함수

p>

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

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

모든 POSIX awk에서 match()의 세 번째 인수는 지원되지 않습니다 . ,하지만 몇 가지 특수 변수 RSTARTRLENGTH는 일치하는 그룹의 시작 길이 를 표시합니다. 현재 행에서 substr() 함수를 사용하여 일치하는 문자열을 가져옵니다.

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

출력을 예쁘게 인쇄하려면 , 다른 답변과 마찬가지로 printf() 함수를 사용할 수 있습니다.

Answer

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 줄 이상이있을 수 있다고 가정합니다. 입력 파일. 터미널에 줄 번호를 인쇄하는 것 외에는 첫 번째 단계에서 수행 할 작업이 명확하지 않습니다.
  • 코드 수정
  • 코드 수정

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다