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

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

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

**ソースファイル**

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

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

答え2

短いアッ方法:

awk -F'|' 'NR==1{ h=$1; print }NF>1 && NR>1 && $0!~"^"h' file
  • -F'|'-|フィールド区切り文字として扱われます。
  • NR==1{ h=$1; print }- 最初のレコードが見つかったら、最初のヘッダーフィールドを$1変数に割り当てますh(ヘッダー行に示すように)。
  • NF>1- 少なくとも2つの|区切りフィールドを持つレコードを印刷します。
  • $0!~"^"h- 記録が存在しないことを追加確認関連タイトル行に

出力:

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

関連情報