정규식에서 문자 "N"으로 시작하는 줄을 포함하고 "N/A"로 시작하는 줄은 제외하는 방법

정규식에서 문자 "N"으로 시작하는 줄을 포함하고 "N/A"로 시작하는 줄은 제외하는 방법

다음과 같은 줄이 많은 파일이 있습니다.

Table
$0.10
100
1
10


Chair
$0.12
N/A
7
5


Desktop
$0.08
86
7
3


Door
$0.00
N/A
7
3

Nails
$0.10
N/A
7
5

Sofa
$0.07
100
7
3

Stool
$1.00
0
7
5

Natural wood
$0.00
99
7
20

Carpet
$0.10
100
7
3

문자로 시작하는 줄을 병합하고 싶습니다. 따라서 출력은 다음과 같아야 합니다.

Table   $0.10   100 1   10       
Chair   $0.12   N/A 7   5       
Desktop $0.08   86  7   3       
Door    $0.00   N/A 7   3       
Nails   $0.10   N/A 7   5    
Sofa    $0.07   100 7   3    
Stool   $1.00   0   7   5       
Natural wood    $0.00   99  7   20  
Carpet  $0.10   100 7   3

이 명령을 사용하면 sed -E ':a;N;/\n[A-M|a-z|O-Zo-z]/!s/\n/\t/;ta;P;D' file다음을 얻습니다.

Table   $0.10   100 1   10       
Chair   $0.12   N/A 7   5       
Desktop $0.08   86  7   3       
Door    $0.00   N/A 7   3       Nails   $0.10   N/A 7   5    
Sofa    $0.07   100 7   3    
Stool   $1.00   0   7   5       Natural wood    $0.00   99  7   20  
Carpet  $0.10   100 7   3

그렇다면 문자 "N"으로 시작하는 줄을 정규식에 포함하고 "N/A"로 시작하는 줄을 제외하려면 어떻게 해야 할까요?

답변1

이것이 awk에 단락 모드가 존재하는 이유입니다. 이는 awk를 사용하는 모든 UNIX 시스템의 모든 쉘에서 작동합니다.

$ awk -v RS= -F'\n' -v OFS='\t' '{$1=$1}1' file
Table   $0.10   100     1       10
Chair   $0.12   N/A     7       5
Desktop $0.08   86      7       3
Door    $0.00   N/A     7       3
Nails   $0.10   N/A     7       5
Sofa    $0.07   100     7       3
Stool   $1.00   0       7       5
Natural wood    $0.00   99      7       20
Carpet  $0.10   100     7       3

위 내용은 모두 관용적인 awk이며, 그 의미는 다음과 같습니다.

  1. RS=<null>귀하의 입력이 빈 줄로 구분된 일련의 레코드(예: 단락)임을 awk에게 알려주세요.
  2. -F'\n'입력 필드가 개행 문자( 와 동일 -v FS='\n')로 구분되어 있음을 awk에 알립니다.
  3. OFS='\t'출력 필드가 탭으로 구분되어야 함을 awk에 알립니다.
  4. $1=$1필드 사이의 모든 FS(줄 바꿈)를 OFS(탭)로 대체하여 현재 레코드를 다시 컴파일하도록 awk에 지시합니다.
  5. 1현재 레코드를 인쇄하기 위해 awks를 호출하는 기본 작업의 실제 조건입니다.

답변2

Steeldriver의 추천 덕분에 해결책을 찾았습니다.

sed -E ':a;N;/\n[A-Za-z][^/]/!s/\n/\t/;ta;P;D'
Table   $0.10   100 1   10       
Chair   $0.12   N/A 7   5       
Desktop $0.08   86  7   3       
Door    $0.00   N/A 7   3    
Nails   $0.10   N/A 7   5    
Sofa    $0.07   100 7   3    
Stool   $1.00   0   7   5    
Natural wood    $0.00   99  7   20  
Carpet  $0.10   100 7   3

답변3

NR(레코드 수)로 수행할 수 있지만 빈 줄을 제거해야 합니다.

   sed '/^$/d' filename | awk '{ORS=(NR%5?FS:RS)}1'

관련 정보