我认为这是一个非常常见的问题,但我找不到足够准确的答案。我需要使用MATLAB或使用足够简单的命令行提示来回答。 我在目录中有(很多).csv文件,它们都是相似的。说文件看起来像,
1,2
3,4
我现在希望它们看起来像
,c1,c2
t1,1,2
t2,3,4
我不是100%确定如何在StackExchange上正确格式化条目。第一行和第二行之间没有空行。我正在做的是 - 我添加了一个列" t1 t2 ..."和行" c1 c2 ..."到所有文件。文件中的第一个单元格是空白的。我需要对目录中的所有文件执行此操作。当然,t1 t2值和c1 c2值应该针对文件的整个大小运行。
我如何做到这一点?
答案 0 :(得分:1)
这是另一个awk脚本:
#!/usr/bin/awk -f
BEGIN { FS=OFS="," }
{
if( FNR==1 ) {
close(fn); fn=FILENAME ".new"; printf OFS > fn
for(i=1; i<=NF; i++) {
printf "c%d%s", i, (i!=NF) ? OFS:"\n" > fn
}
}
print "t"FNR OFS $0 > fn
}
执行以下操作:
BEGIN { FS=OFS="," } - sets the field separators to
,`FNR==1
- 在每个输入文件的第一行close(fn)
,如果它已打开,请设置fn
等于&#34;您的filename.new&#34 ;然后打印一个前导,
。 FNR
是当前文件中的行号。c#
标题,并将其打印到fn
。然后,将所有行视为有效数据行(无注释):
t# OFS
添加到每个数据行,然后将其打印到fn
我将awk脚本放入文件script.awk
然后chmod +x script.awk
。
在同一目录中给出以下两个输入数据文件(data1
和data2
):
cat data1 data2
1,2
3,4
1,2,3
4,5,6
7,8,9
并运行像script.awk data*
这样的脚本会提供以下两个.new
数据文件:
cat data1.new data2.new
,c1,c2
t1,1,2
t2,3,4
,c1,c2,c3
t1,1,2,3
t2,4,5,6
t3,7,8,9
只要文件名彼此相似且不匹配脚本的名称,就应该很容易将它们全部传递给脚本。当数字的长度增加时,我没有任何对齐列的内容,只足以为c#
行提供一个前导空格。
答案 1 :(得分:0)
你应该展示一些你已经厌倦的代码,如果它不起作用,你可以问堆栈溢出的人,大多数人在没有代码的情况下甚至不会帮助你。以下是您要做的事情的概要,您可以在自己喜欢的编程语言/环境中实现它
csv
中的每一行现在我们正在尝试在输出文件中创建每一行
一个。使用空格(或其他一些分隔符)分割线
湾将t1写入输出并插入分隔符
℃。从你的分裂中写下第一个和第二个“代币”
d。将t2写入输出并插入分隔符
即将剩余列写入行
F。在输出文件
关闭 csv 和输出文件
可选“覆盖”原始csv
答案 2 :(得分:0)
awk '{
FS=" "
if (NR == 1) {
printf ("%s", FS)
for (col=1;col < NF;col++) printf( "c%d%s", col, FS)
printf( "c%d\n", NF)
}
if ( $0 !~ /^[[:space:]]*$/ ) {
printf ( "t%d%s%s\n", NR, FS, $0)
}
}' YourFile
FS=" "
tX
行首添加find ...
或批处理循环以在文件夹中的每个csv中更改
答案 3 :(得分:0)
使用GNU awk 4. *代表-i inplace
:
$ cat tst.awk
BEGIN { FS=OFS="," }
FNR==1 {
for (i=1;i<=NF;i++)
printf "%sc%d%s",(i>1?"":OFS),i,(i<NF?OFS:ORS)
}
{ print "t" FNR, $0 }
$ cat file
1,2
3,4
$ awk -i inplace -f tst.awk file
$ cat file
,c1,c2
t1,1,2
t2,3,4
只需将file
更改为*
,即可更新目录中的每个文件。