csvファイルセットがあり、各ファイルの最初の行にはデータセットのフィールド名が含まれています。一部のcsvファイルのフィールド名はすべて大文字で、他のファイルのフィールド名はすべて小文字です。私の質問は、各ファイルの最初の行(フィールド名とも呼ばれます)が各列にすべて大文字の文字列として表示されるように各csvファイルをどのように変更しますか?
例: Dataset1.csv
a b c
x x x
Dataset2.csv
A B C
y y y
Dataset1.csvを次のように表示するにはどうすればよいですか?
A B C
x x x
答え1
これはGNU sedの大文字オプションを介して行うことができます。内部オプション-i
:
sed -i '1s/.*/\U&/' Dataset1.csv
答え2
awkとGNU sedを使用してこれを行うことができます。
方法1
awk 'NR==1{(i=toupper($0));print i}' Dataset1.csv ; awk 'NR >=2 {print $0}' Dataset1.csv
出力
A B C
x x x
z z z
方法2
sed '1s/.*/\U&/g' Dataset1.csv
出力
A B C
x x x
z z z
答え3
私の質問がそのサイトのトピックに関連していないということを聞いて、次のような答えを得たので、これはstackoverflowで再公開されました。
ファイルが改行で終わることを考えると、次のようになります。
head -1 Dataset1.csv | tr '[:lower:]' '[:upper:]' > Dataset1_new.csv ; tail -$(( $(wc -l Dataset1.csv | cut -d ' ' -f 8) - 1 )) Dataset1.csv > Dataset1_new.csv
head -1 Dataset1.csv | tr '[:lower:]' '[:upper:]'
: ファイルの最初の行を取得し、大文字に変換して標準出力に出力します。
> Dataset1_new.csv
:出力をDataset1_new.csvという名前の新しいファイルにリダイレクトします。
tail -$(( $(wc -l Dataset1.csv | cut -d ' ' -f 8) - 1 ))
Dataset1.csv:残りの行出力
> Dataset1_new.csv:
再度、出力を Dataset1_new.csv ファイルにリダイレクトします。
GNU sedを使用してこれを行うことができます。
$ sed -i -e '1 s/\(.*\)/\U\1/' input.csv
これを達成するためにawkを使用することもできます。
awk -i.bak 'NR==1{ print toupper($0) }NR>1' Dataset1.csv
説明する:
awkはcsvファイルをバックアップし、最初の行(NR = = 1)に対して行全体$ 0を大文字に変更し、ファイルの残りの部分(NR> 1)に対して行を印刷するデフォルト値を実行します。