Bash/Shell:分析第n列中包含数据的行的选项卡分隔CSV
我有一个单独的CSV标签,可以下载并在本地打开 我想在第n列中显示包含数据的任何行,即在该行的第n个制表符之前包含除制表符以外的任何内容的行 我会发布我到目前为止尝试过的东西,但我的sed知识只足以假设它可以用sed完成 edit1: 样品Bash/Shell:分析第n列中包含数据的行的选项卡分隔CSV,bash,shell,csv,awk,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(name),那么我想输出行1+3 如果n=4(标题),那么我想输出所有的行 编辑2: 我找到了这个可能的解决方案
id num name title
1 1 foo foo
2 2 bar
3 3 baz baz
如果n=3(name),那么我想输出行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
无法工作(结果文件为空),因此可能是我弄错了\t?(在不理解awk的情况下复制和粘贴)我不确定我是否理解您想要的行为。是这个吗
$ 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) 使用
cut
获取所需的列N(分隔符按标准为制表符)
2) 仅获取非空行的行号
grep -c '^$' -n tempfile | sed 's/:.*//' > linesfile
3) 使用sed提取行
while read $linenumber ; do
sed "$linenumber p" >> newdatafile
done < linesfile
读取$linenumber时;做
sed“$linenumber p”>>新数据文件
完成<行文件
不幸的是,通过管道将切割输出传输到grep无法提取行号,但我非常确定还有更优雅的解决方案。名称和标题之间的区别是什么。我看到的是name可以为null,但title不能为null,否则两者都是相同的。我说得对吗?太好了,第二个正好可以。(我真的需要学习awk)。谢谢
while read $linenumber ; do
sed "$linenumber p" >> newdatafile
done < linesfile