用于“填充”文本文件中的列的命令,类似于 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 为您期望在一行中看到的最大数量的字段(曾经)。

相关内容