2014-12-06 33 views
0

OS X 10.9.5,Terminal ver。 2.4awk命令似乎是转置

我有一个.csv文件,大约有100,000行,大约200列。我想过滤列并创建一个新的.csv文件与指定的列。

我一直在阅读一些awk教程,但似乎无法让最基本的命令正常工作。例如,要打印整个第一列,我试过这个:

awk '{print $1}' oldfile.csv 

但我只获得第一行的第一个值。

当我试试这个:

awk -F"," '{print $1}' file.csv 

我得到整个第一行。

如何获取列而不是行?

编辑:

经过这些谁回答的意见,我做了以下内容:

file file.csv 

我回来data

我想:

tr -d '\r' <file.csv> unixfile.csv 

然后当我运行awk命令时得到了和以前一样的结果。

所以我创建了一个小awktest.csv文件我的OS X的机器上:

col1 col2 col3 col4 
1  2  3  4 
1  2  3  4 
1  2  3  4 

尝试:

print -F"," '{print $1}' awktest.csv 

和回来:

col1 

尝试:

print '{print $1}' awktest.csv 

和回来:

1,2,3,4l2,Col3,Col4 

任何建议?

+4

显示输入文件的样本,和你预期的输出,在这一问题。 – quantdev 2014-12-06 17:50:28

+1

由于您在OS X上,请确保您的文件具有unix样式行结尾(0x0a)而不是Mac(0x0d)。使用Mac行结束符,awk将整个文件视为一条大线。您可以运行命令'file oldfile.csv'来检查。如果它显示“ASCII文本,带有CR行结束符”,则该文件需要转换为unix。 – jas 2014-12-06 18:09:13

+0

您的输入文件是在Windows上创建的,因此具有追踪控制-Ms。用dos2unix或类似工具删除它们,然后运行你的awk命令。 – 2014-12-06 18:14:34

回答

0

我试图改变awktest.csvawktest.txt,当我跑:

awk -F"," '{print $1}' awktest.txt 

我得到了整个第一列,这是我所期待的。

我试着将我原来的file.csv文件更改为file.txt,但是当我运行awk时没有快乐。我做了一些谷歌搜索重:马克·瑟特查的tr命令,发现这种变化:

tr '\r' '\n' <oldfile> newfile 

所以我跑了我的新file.txt

tr '\r' '\n' <file.txt> newfile.txt 

然后

awk -F"," '{print $1}' newfile.txt 

给我我期待什么。随后的更多专栏的试验给了我正是我想要的。

现在要弄清楚最初的问题是什么,以及这些更改为什么修复它。

+1

你最初的问题是file.txt有MAC行结束符('\ r'),但awk的默认记录分隔符是unix行结束符('\ n')。通过翻译文件的行结束符,您可以按预期工作。要在原始文件上运行awk,请更改记录分隔符,如下所示:'awk -F“,”-v RS =“\ r”'{print $ 1}'file.txt' – jas 2014-12-06 20:37:07

+1

@jas是正确的,文件'告诉你你的文件是'data',因为文件末尾没有换行符(你显然没有)不是文本文件。我会将所有'\ r's转换为'\ n's,而不是改变awk RS,尽管这对于awk会起作用,它会导致您与其他UNIX工具出现问题。只需使用'\ n's,而不是'\ r's。 – 2014-12-06 21:14:39

0

你最初的问题是,具有file.txt的MAC行终止(' \ r '),但对于AWK的默认记录separataor是Unix的行终止(' \ n ')。通过翻译文件的行结束符,您可以按预期工作。要在原始文件的awk运行,更改记录分隔符是这样的:
awk -F"," -v RS="\r" '{ print $1 }' file.txt –  雅