列項目を別の列の内容に条件付きに置き換える

列項目を別の列の内容に条件付きに置き換える

csvファイルに金融価格データがあり、一般的な行は次のとおりです。

2012-06-06 18:00:00,2012-06-06 19:00:00,4,2012-06-06 14:00:00,4,1644.8005,1644.8,1631.232,1632.266,7353,TRUE

この特定の例では、列6と7の両方が同じ値を含むように、条件に応じて列7の内容を列6の内容に置き換えようとします。

これらの条件付き操作を完了する必要があるファイル行番号は、別のテキストファイル(別のプログラムOctaveの出力「line_index_file」と呼ばれる)から読み取られます。たとえば、次のようになります。

100
125

これは、上記の操作が元のデータファイルの100行と125行にのみ適用できることを意味します。

sedまたはawkを使用してこれをどのように実行できますか?

答え1

これを試してみてください。

awk 'BEGIN{FS=OFS=","}NR==FNR{a[$0];next}FNR in a {$7=$6}1' line_index_file file.csv

答え2

この試み

 for i in `cat line_index_file`
 do
     echo -e "`awk -v b=$i -F ',' 'BEGIN{OFS = ","} NR!=b{$7=$6};{print $0}' file.csv`" > file.csv
 done
  • NR!=b条件の行番号を無視

答え3

sedエディタを使用してこれを実行することもできます。

cmds=$(< line_index_file xargs -l printf '\t%sba\n')

sed -e "
${cmds}
    ;# skip these
    b
    :a
    s/,/\n/5;s//\n/5;s//\n/5
    s/\n\(.*\)\n.*\n/,\1,\1,/
" input.csv

説明する:

  • まず、ブランチに記載されている行cmdsのラベル情報を保持するシェル変数を作成します。:aline_index_file
  • line_index_fileに記載されていない他の行の処理をスキップします。
  • 5番目、6番目、7番目のフィールドの末尾にマーカーを配置します\n(この場合、パターンスペースに改行文字が見つからないことが保証されるためです)。sed
  • 次に、6番目のフィールドの内容を7番目のフィールドに入れる操作を実行します。

関連情報