ソースファイルには、カンマ区切りフィールドとパイプ区切りフィールドが含まれています。コンマとパイプで区切られた重複ヘッダーレコードも含まれています。
**ソースファイル**
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
パイプで区切られたヘッダーとパイプで区切られたすべてのレコードを保持したいと思います。
以下を無視してください。
カンマ区切りのすべてのフィールドの履歴とタイトル
パイプで区切られたヘッダーが重複しています。
仮説
パイプ区切り記号ヘッダーの最初のフィールド = FOOID
パイプで区切られたフィールドにはカンマを含めることができます。
この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