正規表現で文字「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'

関連情報