Bash

Bash - 將有問題的空格分隔表轉換為分號分隔的列表

  • January 19, 2021

我有一個程序可以在空格分隔的表中輸出多行數據。我需要將此輸出轉換為分號分隔的列表。

這是一個範例記錄。每個欄位都有一定數量的字元,由一定數量的空格填充,但是,欄位中的字元數量和填充空格取決於欄位,如下所示:

FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD.WithSpace....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>

通常,只做類似的事情不會是一個問題

command | tr -s ' ' ';'

理想情況下會產生這樣的結果:

FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>

但是,如上所述,欄位本身可以包含空格,並且為了使事情複雜化,它們在列印時不帶引號。因此,執行上面的*“tr -s ’ ’ ‘;’"*命令實際上是這樣做的:

FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD;WithSpace;<etc>
                                             ^ <-- Problem here :(

我終其一生都無法弄清楚如何從這些數據中創建一個以分號分隔的列表,而不會破壞其值中有空格的欄位。如果有人知道如何解決這個問題,那真是太棒了!

我認為您應該首先預處理所有欄位值,嘗試檢測欄位的格式並將其轉換為正則表達式,然後在添加分隔符之前對文本進行規範化。

FIELD FIELD2x   FIELD3xxxx         FIELD4xxxxxxxxx       FIELD5xxxxxxxx    <etc>
FIELD FIELD2x   FIELD3xxxx         FIELD4xxxxxxxxx       FIELD5xxxxxxxx    <etc>
FIELD FIELD2x   FIELD3xxxx         FIELD4xxxxxxxxx       FIELD 7xxx    <etc>

正則表達式欄位格式:

(FIELD[\s\dx]+)

==> 使用sed / awk … 更新到新的欄位格式 ==> 添加分隔符。

引用自:https://unix.stackexchange.com/questions/629782