【发布时间】:2017-08-29 14:43:35
【问题描述】:
我正在处理一个文本文件并添加一个由其他列的某些组件组成的列。提出了删除空格和撇号的新要求,但我不确定完成此任务的最有效方法。
文件的内容可以通过以下脚本创建:
content=(
john smith thomas blank 123 123456 10
jane smith elizabeth blank 456 456123 12
erin "o'brien" margaret blank 789 789123 9
juan "de la cruz" carlos blank 1011 378943 4
)
# put this into a tab-separated file, with the syntactic (double) quotes above removed
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "${content[@]}" >infile
这是我现在拥有的,但它无法删除空格和撇号:
awk -F "\t" '{OFS="\t"; print $1,$2,$3,$5,$6,$7,$6 tolower(substr($2,0,3)); }' infile > outfile
这会引发错误“子第三个参数不是可更改的对象”,这是有道理的,因为我想我正在尝试处理输出而不是输入。
awk -F "\t" '{OFS="\t"; print $1,$2,$3,$5,$6,$7,$6 sub("'\''", "",tolower(substr($2,0,3))); }' infile > outfile
有没有办法可以将第 6 列和第 2 列的一部分以小写形式打印,同时从输出中删除空格和撇号到新列?在最坏的情况下,我可以使用我的第一个命令创建一个新文件并使用新的 awk 命令处理该输出,但我想一次性完成。
【问题讨论】:
-
您是否有理由为此需要
awk,而不是使用(比如说)bash 内置功能? -
提供一个不需要别人提供自己的
infile进行测试的独立示例也会很有帮助。 -
我没有 awk 作为要求,但考虑到我正在处理一个包含制表符分隔内容的文件并且我不希望将更改应用于所有列,这似乎是一个合乎逻辑的解决方案。如果您有其他不使用 awk 的解决方案,我绝对愿意接受其他选择。
-
请edit 提供输入和所需的输出——否则,有可能解决方案的人无法测试它们。这可能只是一个生成输入的命令,例如:
{ printf '%s\t' foo bar "two words" "'five words enclosed in quotes'" baz; printf '\n'; } | awk ...;另请参阅有关构建 minimal reproducible example 的文档。 -
也就是说,在 bash 中,
while IFS=$'\t' read -r -a words; do ...将遍历输入流,将每个部分放入数组words的一个元素中;${foo//[[:space:]\']}将评估为foo的一个版本,其中删除了空格和撇号......这是你需要在没有 awk 的情况下执行此操作的重要部分。