다음과 같은 줄이 많은 파일이 있습니다.
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이며, 그 의미는 다음과 같습니다.
RS=<null>
귀하의 입력이 빈 줄로 구분된 일련의 레코드(예: 단락)임을 awk에게 알려주세요.-F'\n'
입력 필드가 개행 문자( 와 동일-v FS='\n'
)로 구분되어 있음을 awk에 알립니다.OFS='\t'
출력 필드가 탭으로 구분되어야 함을 awk에 알립니다.$1=$1
필드 사이의 모든 FS(줄 바꿈)를 OFS(탭)로 대체하여 현재 레코드를 다시 컴파일하도록 awk에 지시합니다.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'