将CSV文件的第一行更改为全部大写

时间:2018-02-09 00:29:49

标签: bash csv awk sed

我有一组csv文件,对于每个文件,第一行包含数据集的列名。某些csv文件具有所有大写列名称,其他csv文件具有所有小写列名称。我的问题是如何更改每个csv文件,以便每个文件的第一行(也就是列名称)显示为每列中的所有大写字符串?

我的尝试如下: 首先,我手动检查所有文件以查看哪些文件具有大写和小写的列名,然后运行以下命令:

head -1 uppercase.csv > header.csv
#repeated all commands below for all lowercase files individually
sed -i 1d lowercase.csv 
cat header.csv lowercase.csv > lowercase_new.csv
rm lowercase.csv
mv lowercase_new.csv lowercase.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

4 个答案:

答案 0 :(得分:7)

关注简单的awk也可以帮助您。

awk 'NR==1{$0=toupper($0)} 1'  Input_file

<强> 说明: NR==1:如果是第一行则检查条件,然后执行以下操作:

$0=toupper($0)将当前行的值设为大写并保存到它。

1 awk适用于条件方法然后执行操作,因此我在此处设置条件为TRUE而不提及此处的任何操作,因此默认情况下会打印当前行。

如果您想将输出保存到Input_file本身,请将以下内容附加到上面的解决方案> temp_file && mv temp_file Input_file。其中Input_file是您要更改或传递给awk的数据文件。

答案 1 :(得分:4)

您可以使用 sed

进行此操作
$ sed -i -e '1 s/\(.*\)/\U\1/' input.csv

答案 2 :(得分:2)

只是指出显而易见的,你的命令可以很好地放入脚本并在一组文件上执行。

#!/bin/sh

head -n 1 uppercase.csv > header.csv

for lowercase; do
    sed -i 1d "$lowercase"
    cat header.csv "$lowercase" > "$lowercase"_new
    rm "$lowercase"
    mv "$lowercase"_new "$lowercase"
done

rm -f header.csv

将其保存为headerfix,然后使用chmod +x ./headerfix使其可执行,然后使用./headerfix lower1.csv lower2.csv lower3.csv运行它以修复这三个文件中的标题。

正确的生产脚本会使用正确的随机临时文件名(使用mktemp)并注意清除它们即使它也被中断(使用trap);我猜整个循环体可以重构成一个sed脚本(在这种情况下,不需要循环)但你已经有了很好的答案,可以很好地做到这一点。

答案 3 :(得分:1)

您也可以将awk用于此目的:

$ awk 'NR==1{ print toupper($0) }NR>1' Dataset1.csv 

<强>说明:

第一行(NR==1)会将整行$0更改为大写,然后文件的其余部分(NR>1)将执行默认操作,即打印行

现在,如果您想生成一个文件,只需重定向stdout

$ awk 'NR==1{ print toupper($0) }NR>1' Dataset1.csv > new_file.csv

或者如果您想编辑初始文件,请执行以下操作:

$ awk 'NR==1{ print toupper($0) }NR>1' Dataset1.csv > tmp.csv && mv tmp.csv Dataset1.csv

另一种完全不同的方法是将trtailhead组合在一个命令中:

$ cat toUpper.csv 
a b c
x x x 
y y y
z z z

$ (head -1 toUpper.csv | tr [[:lower:]] [[:upper:]] && tail -n +2 toUpper.csv ) > new_file.csv

$ cat new_file.csv 
A B C
x x x 
y y y
z z z