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