AWKコマンド - CSVの空の「セル」をテキスト値として編集します。

AWKコマンド - CSVの空の「セル」をテキスト値として編集します。

私の問題が印刷上のエラーに近い場合は申し訳ありません。しかし、しばらくこの問題を解決しようとしましたが、残念ながら正常に動作させることはできません。 sedコマンドを使用する必要があるかもしれませんが、sedで列を指定する方法がわかりませんでした。初心者ですが、awkコマンドの経験がたくさんあります。

これが目標です。一部の行にはnull(空白)値があり、他の行には値を持つ列(14)を持つCSVファイルfile1があります。それでも他のすべての列を出力に含めたいのですが、14列の空の列を新しい値に変更するだけです。該当なし

例:

列14
値1
値2

値3

awk コマンドを使用して列 14 で空行を検索し、見つかった場合、セルに新しいテキスト値 NA を入力しました。

これが私が試しているコマンドですが、新しいファイルの列14にまだ空のセルがあります。どんな助けでも大変感謝します。ありがとうございます。

注文する:

awk -F"," 'BEGIN {OFS=","} $14 == "" { $14 = "NA" }  {print}' file1 > file2


ターゲット:

例:

列14
値1

2該当なし
値3

時間をかけて読んで助けてくれた皆さんに感謝します。

修正する

要求に応じて、以下はいくつかのサンプルデータです。

"employee_number","employee_login","is_active","send_pkg_email","send_na_email","last_name","first_name","department","title","phone_number","employee_type","email","charge_code","area_code","mailstop","roomid"
"103293","[email protected]","Y","","","Smith","Jessica","","","+1 (650) 3530975","Employee","[email protected]","","LOC0028.03","","03.C.01H"
"103295","[email protected]","Y","","","Long","Fred","","","+1 (415) 9449428","Employee","[email protected]","","LOC0025.01","","01.D.04B"
"103297","[email protected]","Y","","","Cheng","Laura","","","+1 (650) 8623342","Contingent","[email protected]","","","",""
"103307","[email protected]","Y","","","Brown","Chris","","","+1 (512) 9644927","Employee","[email protected]","","ATX0607.16","","16.B.10D"
"103310","[email protected]","Y","","","Williams","Stan","","","+1 (650) 8048591","Employee","[email protected]","","LOC0061.03","","03.D.01B"

答え1

$ perl -MText::CSV=csv -e '
  $csv = Text::CSV->new();
  while(my $row = $csv->getline(ARGV)) {
    $row->[13] = "NA" if ($row->[13] eq "");
    $csv->say(STDOUT, $row);
  };' input.csv

Perl配列は1ではなく0から始まるので、フィールド14は$rowarrrayrefの要素13です。

employee_number,employee_login,is_active,send_pkg_email,send_na_email,last_name,first_name,department,title,phone_number,employee_type,email,charge_code,area_code,mailstop,roomid
103293,[email protected],Y,,,Smith,Jessica,,,"+1 (650) 3530975",Employee,[email protected],,LOC0028.03,,03.C.01H
103295,[email protected],Y,,,Long,Fred,,,"+1 (415) 9449428",Employee,[email protected],,LOC0025.01,,01.D.04B
103297,[email protected],Y,,,Cheng,Laura,,,"+1 (650) 8623342",Contingent,[email protected],,NA,,
103307,[email protected],Y,,,Brown,Chris,,,"+1 (512) 9644927",Employee,[email protected],,ATX0607.16,,16.B.10D
103310,[email protected],Y,,,Williams,Stan,,,"+1 (650) 8048591",Employee,[email protected],,LOC0061.03,,03.D.01B

Employee_number を含む行は103297現在該当なし14番目のゲームで。

ただし、ここの出力フィールドは必要な場合にのみ二重引用符で囲みます(たとえば、スペースが含まれている場合、またはカンマが含まれていても引用符で囲まれます)。出力のすべてのフィールドを入力ファイルのように参照するには、この$csv = Text::CSV->new();行を次に変更します。

$csv = Text::CSV->new({always_quote => 1});

テキスト::CSV他にも多くのオプションがあります。たとえば、これを使用すると、$csv = Text::CSV->new({always_quote => 1, strict => 1});入力行のフィールド数が異なる場合でもエラーが発生します。man Text::CSV詳細より。


またはawkスクリプトの簡単な修正:

awk -F"," 'BEGIN {OFS=","}; $14 == "\"\"" { $14 = "\"NA\"" };1' input.csv

これは、CSVファイルを分割するためにのみコンマを使用するときに発生する問題を強調します。"フィールドデータでラップされた文字と"フィールドデータの一部である文字を区別することはできません。この単純な分割方法はそのような区別をしないからです。

フィールド14いいえ入力行をカンマで区切る場合は空です。 2つの引用符文字("")が含まれています。

この awk 1 行ステートメントは、フィールドにコンマ文字が含まれている場合でも中断されます。これがCSVパーサーを使用する方が良いもう一つの理由です。

バラよりcsvファイルを処理する強力なコマンドラインツールはありますか?

良いawk csvパーサーもありますhttps://github.com/geoffroy-aubry/awk-csv-parser

答え2

ただし、列14には空の文字列が含まれていないため、両方の引用""符(エスケープする必要があります)を確認する必要があります。

awk -F"," 'BEGIN {OFS=","} $14 == "\"\"" { $14 = "NA" } {print}' file1 > file2

関連情報