我有一个文本文件,其中包含行和这些行中的列。本质上,我想复制 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
为您期望在一行中看到的最大数量的字段(曾经)。