次のような行が多いファイルがあります。
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'