Bash / Shell:分析带有第n列数据的行的制表符分隔CSV

时间:2015-07-16 07:26:29

标签: bash shell csv awk

我有一个以制表符分隔的CSV,可以下载并在本地打开。

我想在第n列中显示包含数据的所有行,即除了该行的第n个制表符之前的制表符之外的其他行。

我发布了迄今为止我尝试过的内容,但我的sed知识仅仅是假设它可以用sed完成。

EDIT1:

样品

id num name title
1  1   foo  foo
2  2        bar
3  3   baz  baz

如果n = 3(名称),那么我想输出行1 + 3。

如果n = 4(标题),那么我想输出所有行。

编辑2:

我找到了这个可能的解决方案:

awk -F '","'  'BEGIN {OFS=","} { if (toupper($5) == "STRING 1")  print }' file1.csv > file2.csv 

来源:https://unix.stackexchange.com/questions/97070/filter-a-csv-file-based-on-the-5th-column-values-of-a-file-and-print-those-reco

但是尝试

awk -F '"\t"'  'BEGIN {OFS="\t"} { if (toupper($72) != "")  print }' data.csv > data-tmp.csv

不起作用(结果文件为空),所以我确实错了? (复制和粘贴,不理解awk)

2 个答案:

答案 0 :(得分:3)

我不确定我理解你想要的行为。这是吗?

$ cat file
id      num     name    title
1       1       foo     foo
2       2               bar
3       3       baz     baz

$ awk -v n=3 -F$'\t' 'NR>1&&$n!=""' file
1       1       foo     foo
3       3       baz     baz

$ awk -v n=4 -F$'\t' 'NR>1&&$n!=""' file
1       1       foo     foo
2       2               bar
3       3       baz     baz

答案 1 :(得分:-2)

我假设您在远程计算机上有足够的空间:

1)使用cut获取所需的列N(分隔符是标准的制表符)

cut -f N > tempfile

2)仅获取非空行的行号

grep -c '^$' -n tempfile | sed 's/:.*//' > linesfile

3)使用sed提取行

while read $linenumber ; do
    sed "$linenumber p" >> newdatafile
done < linesfile 

不幸的是,无法通过将剪切输出管道输出到grep来提取行号,但我非常确定有更优雅的解决方案。