awk または sed を使用してパターンと行を連結します。

awk または sed を使用してパターンと行を連結します。

デフォルトでは、SourceFieldを含む各行の前にクエリ名を入力したいと思います。

私はこの接続方法を試しました

awk '/<\^Query/ && p{print p;p=""}{p=p $0}END{if(p) print p}' 

ただし、これは複数のソースフィールドがある場合にのみ機能します。この場合、すべての行をSourceFieldに関連付けます。

Query: D Monthly Loan SourceField: LOAD-NO         SourceTable: MASTER SourceField: LO  

私のデータは次のとおりです

Query: D Monthly Loan
    SourceField: LOAD-NO         SourceTable: MASTER
    SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan
    SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1
    SourceField: LOAN-NO         SourceTable: MASTER

出力が次のようになります。

Query: D Monthly Loan SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan SourceField: HI              SourceTable: MASTER2
Query: M FORBEARANCE_1 SourceField: LOAN-NO        SourceTable: MASTER

答え1

$ awk '/^ +/{print q, $0; next} {q=$0}' file
Query: D Monthly Loan     SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan     SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan     SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1     SourceField: LOAN-NO         SourceTable: MASTER

または、次の形式のいずれかを好む場合(他の可能性もたくさんあります!):

$ awk 'sub(/^ +/,""){print q, $0; next} {q=$0}' file
Query: D Monthly Loan SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1 SourceField: LOAN-NO         SourceTable: MASTER

$ awk '/^ +/{$1=$1; print q, $0; next} {q=$0}' file
Query: D Monthly Loan SourceField: LOAD-NO SourceTable: MASTER
Query: D Monthly Loan SourceField: LO SourceTable: MASTER
Query: D Monthly Loan SourceField: HI SourceTable: MASTER2
QUERY: M FORBEARANCE_1 SourceField: LOAN-NO SourceTable: MASTER

$ awk -v OFS='\t' '/^ +/{$1=$1; print q, $0; next} {q=$0}' file
Query: D Monthly Loan   SourceField:    LOAD-NO SourceTable:    MASTER
Query: D Monthly Loan   SourceField:    LO      SourceTable:    MASTER
Query: D Monthly Loan   SourceField:    HI      SourceTable:    MASTER2
QUERY: M FORBEARANCE_1  SourceField:    LOAN-NO SourceTable:    MASTER

答え2

sed -n -e '/^Query:\|^QUERY:/{h;}' -e '/^  *SourceField:/{G;s|\(.*\)\n\(.*\)|\2\1|p;}' file
  • /^Query:\|^QUERY:/{h;}Query:/で始まる行はQUERY:予約済みスペースに配置されます。
  • / *SourceField:/行が空白の数に関係なく始まると、次のようになりますSourceField:
    • G改行文字が前に来る空間保存コンテンツです。
    • s|\(.*\)\n\(.*\)|\2\1|p改行の周囲のフィールドを変更して結果を印刷します。

sed が拡張正規表現をサポートしている場合の単純化されたバージョン:

sed -nE -e '/^Query:|^QUERY:/{h;}' -e '/^ +SourceField:/{G;s|(.*)\n(.*)|\2\1|p;}' file

出力:

Query: D Monthly Loan    SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan    SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan    SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1    SourceField: LOAN-NO         SourceTable: MASTER

答え3

GNU awkを使う:

awk '/^Q/{query=$0; next}; /^ /{gsub(/^ */,"",$0); print query,$0}' file

出力:

クエリ: D 月別ローンソースフィールド: LOAD-NO ソーステーブル: MASTER
クエリ:D月別ローンソースフィールド:LOソーステーブル:MASTER
問い合わせ:D月別ローンソースフィールド:HIソーステーブル:MASTER2
クエリ: M FORBEARANCE_1 ソースフィールド: Loan-No ソーステーブル: MASTER

gsub(/^ */,"",$0)先行スペースを削除します。

答え4

awk '
/^Query:/ || /^QUERY:/ {queryline=$0}
/ SourceField:/ {print queryline " " $0}
' data.txt

関連情報