我有一个csv文件,每行有一个条目,三个条目构成了整个数据集。因此,我现在要做的是将这些集合放在每一行的列中。我很难描述问题(因此我的搜索没有给我解决方案),所以这里有一个例子。
样本CSV文件:
1 Joe
2 Doe
3 7/7/1990
4 Jane
5 Done
6 6/6/2000
我最后想要的是:
1 Name Surname Birthdate
2 Joe Doe 7/7/1990
3 Jane Done 6/6/2000
我正在尝试寻找一种自动解决方案,因为我的实际文件由480个数据集组成,每个数据集包含16个条目,而手动进行将需要几天的时间。
我能够用Excel的间接函数填充第一行:
=INDIRECT("A"&COLUMN()-COLUMN($A1))
当COLUMN返回列号时,如果我在Excel中向下拖动第一行,显然这与第一行完全相同:
1 Name Surname Birthdate
2 Joe Doe 7/7/1990
3 Joe Doe 7/7/1990
现在我正在寻找一种将单元格位置增加一个的方法:
A B C D
1 Joe =A1 =B1+1 =C1+1
2 Doe =D1+1
3 7/7/1990
4 Jane
应该导致什么:
A B C D
1 Joe =A1 =A2 =A3
2 Doe =A4 =A5 =A4
3 7/7/1990
4 Jane
在给定的示例中您可以看到,A的单元格坐标以1递增,我不知道如何在Excel中自动执行此操作。我认为肯定有比使用嵌套Excel函数更好的方法,因为任务(增量+1)看起来实际上很容易。
我也愿意接受涉及sed,awk(我只具有非常肤浅的知识)或其他命令行工具的解决方案。
非常感谢您的帮助!
答案 0 :(得分:0)
awk 'BEGIN { y=1; printf "Name Surname Birthdate\n%s",y; x=1;}
{if (x == 3) {
y = y + 1;
printf "%s\n%s",$2,y;
x=1;
}
else {
printf " %s ",$2;
x = x + 1;
}}' input_file.txt
这可能适合您想做的事情。您的示例不包含逗号,因此我不确定它们是否真的在其中。如果是这样,您将需要使用-F,标志稍作修改,以便将其视为此类代码。
第二个代码段将为输出提供一个逗号分隔符。同样,假设您的示例输入文件没有逗号来分隔1 Joe和2 Doe。
awk 'BEGIN { y=1; printf "Name Surname Birthdate\n%s",y; x=1;}
{if (x == 3) {
y = y + 1;
printf "%s\n%s,",$2,y;
x=1;
}
else {
printf " %s,",$2;
x = x + 1;
}}' input_file.txt
两个awk脚本都将x和y变量设置为1,其中y变量将增加行号。 x变量最多可计数3,然后将自身重置为1。这样,它可以连续打印每一行,直到到达第三项,然后在第三项中插入换行符。
使用正则表达式和perl之类的语言可以更容易/更复杂地完成此操作,但是由于您提到过awk,因此我相信这样做会很好。