用於「填充」文字檔案中的列的命令,類似於 Excel 填充功能

用於「填充」文字檔案中的列的命令,類似於 Excel 填充功能

我有一個文字文件,其中包含行和這些行中的列。本質上,我想複製 Excel 的「填充」功能。換句話說,如果一行中有一個空白“單元格”,它將查找其上方的行並填充其上方相應字段中的值。例如,使用“^”作為列分隔符號:

London^Paris^Moscow^Berlin
^^Melbourne^New York^Washington
^^^Sydney^Singapore^New Delhi
^^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
^^^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
^^Bucharest

……變成(為了清楚起見,用大寫字母填滿項目):

London^Paris^Moscow^Berlin
LONDON^PARIS^Melbourne^New York^Washington
LONDON^PARIS^MMELBOURNE^Sydney^Singapore^New Delhi
LONDON^PARIS^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
KUALA LUMPUR^BANGKOK^HONG KONG^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
AMSTERDAM^^Bucharest

因此,本質上,該功能是識別任何空白字段,並且如果有空白字段,則從其上方的相應字段中拉取值。能夠指定欄位/列分隔符號很重要。有任何想法嗎 ?

答案1

awk -F'^' -v OFS='^' \
   '{
        for (i = 1; i <= NF; i++) {
                if ($i == "") $i = save[i]
                else          save[i] = $i
        }
        for (i = NF+1; i <= 99; i++) save[i] = ""
        print
    }'

這使用一個名為 的陣列save 來保存從一行到下一行的值(向下填充)。中的所有內容awk都隱式初始化為 null,因此save在將資料分配給該數組之前,該數組將為空。 (因此,第一行中的任何空白欄位都將保留為空白,因為沒有先前的資料可以複製到其中。)

對於每一行,

  • 對於該行 ( for (i = 1; i <= NF; i++)) 上存在的每個字段,
    • 如果為空,則用該列保存(複製)的值填充它,
    • 否則,請保存目前值以供後續行使用。
  • 然後擦除save目前行中不存在的所有列的陣列。例如,當我們到達第 4 行(只有四個欄位)時,我們「忘記」了第 3 行的第 5 列和第 6 列包含「新加坡」和「新德里」。當我們到達第 7 行(只有一個欄位)時,我們“忘記”了第 5 行的第 2 列包含“Bangkok”,因此無法輸入到第 8 行(其中第 2 列為空白)。

    將 替換99 為您期望在一行中看到的最大數量的欄位(曾經)。

相關內容