単一ファイルで複数の種類のフィールド区切り文字を処理する

単一ファイルで複数の種類のフィールド区切り文字を処理する

ソースファイルには、カンマ区切りフィールドとパイプ区切りフィールドが含まれています。コンマとパイプで区切られた重複ヘッダーレコードも含まれています。

**ソースファイル**

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
FOOID|BIZNO|BARBIZ_CODE
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
FOOID|BIZNO|BARBIZ_CODE
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP
FOOID,BIZNO,BARBIZ_CODE
A0021826,Q022008,Z5,TRASH
B0021826,R022009,Z5,TRASH
C0021826,S022018,Z5,TRASH
FOOID,BIZNO,BARBIZ_CODE

パイプで区切られたヘッダーとパイプで区切られたすべてのレコードを保持したいと思います。

以下を無視してください。

  1. カンマ区切りのすべてのフィールドの履歴とタイトル

  2. パイプで区切られたヘッダーが重複しています。

仮説

  1. パイプ区切り記号ヘッダーの最初のフィールド = FOOID

  2. パイプで区切られたフィールドにはカンマを含めることができます。

このawkスクリプトは、私のファイルから重複したパイプヘッダーを削除します。すべてのCSVレコードを無視するにはどうすればよいですか?

#!/usr/bin/awk -f
BEGIN{ FS="|"
      header_f1 = "FOOID" }
{
if (NR==1) { print $0 }
if (NR>1 && $1 != header_f1 && length > 1) { print $0 }
}

希望する結果

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

ベストアンサー1

あなたの入力例を考えると、次のように動作するようです。

$ awk 'NR == 1 { print } /,/ && /\|/ { print }' input
FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

常に最初の(タイトル)レコードを印刷します。その後、コンマと垂直バーのあるレコードのみが印刷されます。

おすすめ記事