ヘッダー列をフィルタリングしてコピーし、詳細レコードに貼り付けます(固定幅)。

ヘッダー列をフィルタリングしてコピーし、詳細レコードに貼り付けます(固定幅)。

固定幅ファイルのヘッダー列の1つをコピーし、詳細レコードに新しいフィールドを作成してから、そのフィールドを適切なプレースホルダに貼り付ける必要があります。

注:ファイルには複数のヘッダーと詳細レコードがあり、サンプルファイルデータの推定出力は次のとおりです。

レコードタイプ: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 '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"

入力内容を1行ずつ読みます。レコードがH始まる場合は、その番号を取得して1で除算し(前のゼロを削除します)、それを変数に保存してからxレコードechoを出力ファイルに保存します。レコードが空行の場合、echo出力には空行が 1 つだけ含まれます。レコードがanで始まらない場合は、変数で終わりHます。echox

答え3

GNU awkを使用して追加されたすべての数字が1桁ではないと仮定

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

関連情報