我有一個文字文件,其中包含行和這些行中的列。本質上,我想複製 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
為您期望在一行中看到的最大數量的欄位(曾經)。