我有一个以制表符分隔的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
但是尝试
awk -F '"\t"' 'BEGIN {OFS="\t"} { if (toupper($72) != "") print }' data.csv > data-tmp.csv
不起作用(结果文件为空),所以我确实错了? (复制和粘贴,不理解awk)
答案 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来提取行号,但我非常确定有更优雅的解决方案。