过滤并复制标题列并粘贴到详细记录中(固定宽度)

过滤并复制标题列并粘贴到详细记录中(固定宽度)

我需要复制固定宽度文件中的标题列之一,并在详细记录中创建一个新字段,然后将该字段粘贴到该占位符中。

注意:一个文件中有多个标题和详细记录,示例文件数据的预期输出如下。

记录类型:H-标题,D-详细信息。

输入:

H0003A

D0001A

D0002A

D0003A

H0007A

D0001A

D0002A

D0003A

D0004A

D0005A

D0006A

D0007A

H0002B

D0001B

D0002B

H0004A

D0001A

D0002A

D0003A

D0004A

预期输出:

H0003A

D0001A3

D0002A3

D0003A3

H0007A

D0001A7

D0002A7

D0003A7

D0004A7

D0005A7

D0006A7

D0007A7

H0002B

D0001B2

D0002B2

H0004A

D0001A4

D0002A4

D0003A4

D0004A4

答案1

因此,显然您想将每个标题行的第 5 个字符添加到每个非标题行的末尾。在 awk 中:

awk 'BEGIN{OFS=FS=""} /^H/ {x = $5} /^D/ {$(NF+1) = x} 1'

或者(稍微多打字,但避免正则表达式比较)

awk 'BEGIN{OFS=FS=""} $1=="H" {x = $5} $1=="D" {$(NF+1) = x} 1'

Perl 中也类似:

perl -F'' -ple '$_ .= $x if $F[0] eq "D"; $x = $F[4] if $F[0] eq "H"'

对于任性乖张的人

sed -e '/^H/ {p;s/.$//;h;d;}' -e '/^D/ {G;s/\n....//;}'

答案2

Bash 通常不应用作文本处理器,但如果没有发布更好的解决方案,这应该可以完成您的任务:

#!/bin/bash

input=/path/to/input
output=/path/to/output

while read -r record; do
    if [[ "${record:0:1}" == 'H' ]]; then
        x=$(awk -vr=${record//[[:alpha:]]/} 'BEGIN{print r / 1}')
        echo "$record"
    elif [[ -z "$record" ]]; then
        echo
    else
        echo "${record}${x}"
    fi
done <"$input" >"$output"

这将逐行读取您的输入。如果记录以H它开头,则会获取该数字并将其除以 1(以删除前导零)并将其保存到 变量x,然后保存echo到输出文件的记录。如果记录是空行,则echo输出中将仅包含一个空行。如果记录不是以 an 开头,H它将echo以变量x结尾。

答案3

使用 GNU awk,假设并非所有添加的数字都只是 1 位数字

gawk 'match($0, /^H0*([0-9]+)/, m) {n = m[1]} /^D/ {$0 = $0 n} 1' file

相关内容