0

私の入力ファイルはallresponses_11.txt、ヘッダー付きのデータで構成されています:

ID NAME LOC PH
T1 BA KA 99
T2 GT HS 98

次のように出力したい。

seq_num file_num hname
1 11 ID
2 11 NAME
3 11 LOC
4 11 PH

UNIX で目的の出力を得るのを手伝ってください。ファイル名は動的に渡す必要があります。

あなたの助けを借りて、私は次のようにスクリプトを作成しましたが、各単語についてヘッダーの出力を提供しています。私のヘッダーはタブで区切られており、ヘッダー内にスペースがあります。

#!/bin/ksh

export INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared
export SRCDIR=${INFAHOME}/SrcFiles/CSI/INCOMING
export filename=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt
export filenum=$(echo $filename | tr -dc 0-9 |cut -c 1-5)

echo seq_num file_num hname

cnt=1
for h in $(head -1 "$filename")
do
    echo $cnt $filenum $h
    cnt=$((cnt+1))
done

私の出力は

SEQ_NUM  FILE_NUM  HNAME
1  11003  TOTAL COUNT
2  11003  FINAL DAY
3  11003  LADT COUNT

ソース ファイルの区切り文字はタブですが、ヘッダー列の名前にスペースが含まれています。

4

3 に答える 3

1

あなたのファイル日付規則:

export filename=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt

恐ろしいです。次のような表記法を使用すると、多くの作業が楽になります。

filename=${SRCDIR}/AllResponses_11003_2013_06_07_02_17_33_1.txt

または、次のようなよりコンパクトな表記法:

filename=${SRCDIR}/AllResponses_11003_20130607_021733_1.txt

ただし、それは当面の議論に接しています。太陽の下ですべての変数をエクスポートする必要はないことに注意してください。このスクリプトでは、エクスポートされた変数をエクスポートする必要がないことは自明です。

あなたのパス名:

export INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared

ファイルのシーケンス番号を抽出するために、コードで説明していない 3 桁の数字が含まれています。


awk次のようなスクリプトのバリエーションを使用して、必要に応じてデータを処理するためにおそらく使用します。

#!/bin/bash

INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared
SRCDIR=${INFAHOME}/SrcFiles/CSI/INCOMING
filename=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt
filenum=$(basename $filename | sed 's/^[^_]*_\([0-9][0-9]*\)_.*/\1/')

echo seq_num file_num hname

sed 1q "$filename" |    
awk -F $'\t' -v filenum=$filenum '{ for (i = 1; i <= NF; i++) print i, filenum, $i;}'

bashを使用してコマンドライン$'\t'にタブを埋め込むことができるように、シェルを「切り替え」ました。awk代わりに使用kshして、それを単一引用符、タブ、および別の単一引用符に置き換えることができますが、SO Markdown でスペースとタブを区別するのは困難です。

への割り当ては、ファイル名だけを取得するためにfilenum使用します。愛好家は代わりにbasename書くbashでしょう。${filename##*/}それもおそらくうまくいくでしょうksh。後続のsedコマンドは、一連の非アンダースコアの後にアンダースコアで囲まれた数字の文字列をキャプチャします。

このawkコマンドは、タブを入力フィールド区切り記号として使用するため、タブ区切りの空白を含むタイトル要素を処理します。

次のようなデータ ファイルがあるとします。

TOTAL COUNT     FINAL DAY       LADT COUNT
100     Friday  102

(複数の空白の各シーケンスは、データ ファイルのタブです)、およびfilenum=11003、出力は次のとおりです。

seq_num file_num hname
1 11003 TOTAL COUNT
2 11003 FINAL DAY
3 11003 LADT COUNT

タブ区切りの出力列も必要な場合は、スクリプトに追加OFS="\t";します。awk

awk -F$'\t' -v filenum=11003 '{ OFS="\t"; for (i = 1; i <= NF; i++) print i, filenum, $i;}'
1       11003   TOTAL COUNT
2       11003   FINAL DAY
3       11003   LADT COUNT

sed 1qコマンドは厳密には必要ありません。awk入力の最初の行を除くすべてを無視することもできます。

awk -F $'\t' -v filenum=$filenum 'NR==1 { for (i = 1; i <= NF; i++)
                                              print i, filenum, $i;
                                        }'

awk必要に応じて、見出しを印刷できます。タブで区切る必要がある場合は、メリットがあるかもしれません。

于 2013-06-11T11:37:50.463 に答える