我有一组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
答案 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
另一种完全不同的方法是将tr
,tail
和head
组合在一个命令中:
$ 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