我有一个.csv
包含以下格式的多行文件:
¬Country¬,¬Year¬,¬Singer¬,¬Song Title¬
¬Japan¬,¬1999¬,¬Utada Hikaru¬,¬First Love¬
¬South Korea¬,¬1999¬,¬Lee Jung Hyun¬,¬Wa¬
...
我可以用 打印我想要的信息awk
。例如
awk -F'¬' '{print $2" - "$4}' Model.csv | tail -n +2
这将导致:
Japan - 1999
South Korea - 1999
我希望这基于 Bash 脚本中的用户输入,用户可以选择要打印哪些列以及以哪种“格式”打印。例如,如果我希望输出为
[1999] Utada Hikaru - First Love
[1999] Lee Jung Hyun - Wa
我会用
awk -F'¬' '{print "["$4"]" " "$6" - "$8}' Model.csv | tail -n +2
但是,通过使用"["$4"]" " "$6" - "$8
作为输入,awk 不会将其读取为打印命令的模式
#!/bin/bash
read -p "Which format? " format
#User will type here desired print pattern, for example "["$4"]" " "$6" - "$8
awk -v "var=$format" -F'¬' '{print var}' Model.csv
导致
"["$4"]" " "$6" - "$8
"["$4"]" " "$6" - "$8
从示例输入来看,您的字段分隔符实际上是
,
,而不是¬
,并且这些字符的使用方式与符合标准的 CSV 中的¬
双引号 () 的使用方式相同(请参阅使用 awk 高效解析 csv 的最可靠方法)。"
假设情况确实如此,这将在任何 POSIX awk 中执行您想要的操作:
并调整字段编号以将输入视为 CSV:
我假设
¬
换行符不能出现在你的 CSV 字段内。警告:请注意,
format
在 awk 看到它之前,shell 变量正在扩展成为 awk 脚本主体的一部分,因此您必须非常小心允许谁使用该脚本,并确保他们完全理解 awk 语法,除了可能出现的神秘错误之外:这会导致代码注入漏洞:
就我个人而言,我根本不会这样做,而是想出其他界面让用户选择要打印的字段并设置打印格式。