rdz*_*zvr 3 linux text-processing
我想弄清楚如何导出目录中文件的名称,以保存在可以在 Excel 中编辑的 CSV 文件中。该目录如下所示:
$ ls
Sample_38_41_1_A01 Sample_38_41_1_A11 Sample_38_41_1_B09
Sample_38_41_1_C07 Sample_38_41_1_D05 Sample_38_41_1_E03
Sample_38_41_1_F01
Run Code Online (Sandbox Code Playgroud)
我希望 CSV 文件的每一行都具有在该目录中找到的文件的名称。在 Excel 中它应该是这样的:
A B C
1 Sample_38_41_1_A01
2 Sample_38_41_1_A11
3 Sample_38_41_1_B09
4 Sample_38_41_1_C07
5 Sample_38_41_1_D05
6 Sample_38_41_1_E03
7 Sample_38_41_1_F01
8 ...
Run Code Online (Sandbox Code Playgroud)
War*_*ung 12
由于您的示例文件名中没有任何双引号或逗号,因此解决方案非常简单:
$ 'ls' > files.csv
Run Code Online (Sandbox Code Playgroud)
这里有几个微妙之处:
ls如果您有一个别名向命令添加影响输出的标志,您希望引用该命令,例如-F附加文件类型符号的 ,或-C强制多列输出的 。这样的别名在现代 Unix 和类 Unix 系统上很常见。
当ls写入管道而不是终端时,它每行打印一个文件名,而不是您在问题中显示的多列输出。在这种情况下POSIX需要单列输出,并且 GNU 和 BSDls服从。
这个 CSV 文件没有标题行,但 Excel 可以处理;并非所有 CSV 阅读器都可以。
双引号和逗号是 CSV 文件中的特殊字符,因此如果您在包含使用此类字符命名的文件的目录上尝试上述命令,您将无法获得有效的 CSV 文件。
处理这些情况并不太难。
首先让我们以可能只有逗号的文件为例。这将是一个更常见的情况,因为双引号在 Unix 命令外壳中有意义,因此在文件名中使用它们有强烈的阻碍:
$ 'ls' | sed -e 's/^/"/' -e 's/$/"/' > files.csv
Run Code Online (Sandbox Code Playgroud)
这些sed字符串替换命令在每行的开头和结尾放置双引号,这可以防止 CSV 阅读器将逗号视为字段分隔符。
达到相同目的的另一种方法是 perl -ne 'chomp ; print "\"$_\"\n"'
如果您的文件名中确实有双引号,则sed解决方案自然会扩展:
$ 'ls' | sed -e 's/"/\\"/g' -e 's/^/"/' -e 's/$/"/' > files.csv
Run Code Online (Sandbox Code Playgroud)
也就是说,我们在用语义引号将行包起来之前转义任何现有的双引号字符。
一些 CSV 阅读器以不同的方式处理双引号转义,将一行中的两个双引号字符视为文字双引号:
$ 'ls' | sed -e 's/"/""/g' -e 's/^/"/' -e 's/$/"/' > files.csv
Run Code Online (Sandbox Code Playgroud)