Awk

如何僅在一系列列中查找和替換?

  • March 2, 2017

我有一個包含 9267 行的文本文件。我想找到後面有 5 個空格的“A”,並將其替換為所有行上前後有 5 個空格的“A” ,但僅限於第 67 列和第 88 列之間。需要排除這些列之外的文本。我希望sed和/或awk可以在這裡提供幫助,儘管我不知道如何很好地使用它們。


詳細資訊:我正在將 128 頁的 PDF 轉換為電子表格。我使用 PDFedit 將 PDF 保存為文本文件。我打算使用 LibreOffice 插入“文件中的工作表”。事實證明這很困難,因為雖然 PDF 中的列排列良好,但電子表格類型的列在整個文本文件中的文本文件類型列並不完全相同。每 50 行左右就相當於一個不同的 PDF 頁面,電子表格類型的列可能會將一些文本文件類型的列向左或向右移動。換句話說,“Shelf”的電子表格類型列可能在文件的一部分中從文本文件類型列 70 開始,但在另一部分中從文本文件類型列 76 開始。這使得當我嘗試將“固定寬度”插入 LibreOffice 時,電子表格類型的列會重疊。我想通過查找和替換添加空格來使列更加分散,這樣我就可以告訴 LibreOffice 在哪裡定義列。如果我在整個文件上找到並替換,我最終會在我不想要的地方放置空格。


這是一個相當準確的例子:

Item Code             Active Description                                Store Room      Row      Shelf     Bin  On Hand   
 38NUTZSL                Y      3/8"-16 HEX ZINC NUT                     B            03           C         2         0  
 WELD-AL                 Y      WELD, ALUM. ROD, STICK OR SPOOL          A            01             B       2         68.25  
 08300                   Y      WASHER, 7/8 CASE HARDENED 29/32 ID,1 3/4 OD  A            01        C            5         0

更改列分隔符和使用column命令的更好方法:

sed 's/   */;/g' file | column -ts';'

產生:

Item Code  Active  Description                                  Store Room  Row  Shelf  Bin  On Hand
38NUTZSL  Y       3/8"-16 HEX ZINC NUT                         B           03   C      2    0
WELD-AL   Y       WELD, ALUM. ROD, STICK OR SPOOL              A           01   B      2    68.25
08300     Y       WASHER, 7/8 CASE HARDENED 29/32 ID,1 3/4 OD  A           01   C      5    0

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