输入文字为:
9842901121 9942501133 9942501199 9942501133 9842901121
首先,输入文件应仅使用唯一行进行排序。 然后输出
'9842901121',()(now, '9942501133',()(now, '9942501199',()(now,
如果我们在Unix命令行上使用'
(单引号),则提示符转到>
。
为什么?我们如何避免这个问题?
答案 0 :(得分:0)
使用这样的脚本:
#!/bin/sh
sort "$1" | uniq | (
while read line; do
echo "'$line',()(now,"
done
)
将其保存在名为test.sh
的文件中,然后像sh test.sh filetoprocess
一样运行。
答案 1 :(得分:0)
使用sort
和sed
:
sort -u input.file | sed "s/.*/'&',()(now,/"
必须要说的是,连接到任何结尾都是一个非常奇怪的字符串。
shell提示符更改为“>
”的原因是它认为您尚未完成
命令。它被称为辅助提示,可通过$ PS2变量进行设置。例如,如果我键入:
$ sort -u input.file |
> sed "s/.*/'&',()(now,/"
'9842901121',()(now,
'9942501133',()(now,
'9942501199',()(now,
$
当我在管道符号后点击返回时,shell知道命令是不完整的,所以它要求输入的其余部分 - 在这种情况下为sed命令。
我这次使用引号 - 双引号 - 围绕sed脚本告诉shell参数结束的位置。没有这些,我得到一个语法错误,但可以想象shell会误解事物并认为命令是不完整的。我通常在正则表达式字符串周围使用单引号;总的来说,不用担心。但这一次,替换文本包含单引号,然后在整个字符串周围使用单引号需要:
sort -u input.file | sed 's/.*/'\''&'\'',()(now,/'
比双引号版本更难编写和阅读。
来自评论:
cat inputfile.txt | sort | uniq > Inputfile.txt awk -F" " ' {print (echo ""$1" ,()(now,")}' Inputfile1.txt
在上面的命令中,我无法在数字之前和之后添加
'
,但其他人工作正常。
cat
。sort -u
比sort | uniq
更快。-F
awk
选项。使用awk
代替sed
是完全可行的;我们只需要小心引号。麻烦的是,awk
脚本本身需要包括单引号和双引号,这意味着你必须非常小心。我建议使用sed
,因为您不必在脚本中同时使用单引号和双引号。
sort -u inputfile.txt |
awk '{printf "'\''%s'\'',()(now,\n", $0}'
第一个单引号启动单引号字符串;单引号字符串中没有特殊字符,并且后面的第一个单引号终止它。所以,第一个双引号只是一个常规字符。第二个单引号是要记住的序列的开始:'\''
。这些单引号中的第一个终止当前的单引号字符串;反斜杠单引号组合在字符串中嵌入单引号;序列中的第三个单引号启动一个新的单引号字符串。之后,“%s”是字符串的一部分,然后是另一个'\''
序列,以便在脚本中获得另一个单引号;然后是printf()
格式字符串的其余部分,后跟最后的单引号。通过用单引号括起来,我们不必担心在字符串中转义双引号,反引号,反斜杠和美元符号。最终结果是awk
看到了程序文本:
{printf "'%s',()(now,\n", $0}
打印输入数据,其周围带有单引号,后面带有“,()(now,
”序列,以换行符结束。
你能用程序的双引号写出来吗?是的,当然你可以:
sort -u inputfile.txt |
awk "{printf \"'%s',()(now,\\n\", \$0}"
这实际上比单引号版短两个字符,但是有更多机会弄错。使用单引号,我需要做的就是用'\''
序列替换应该出现在脚本中的每个单引号;使用双引号,我不得不担心逃避其他特殊字符。
对单引号和双引号的充分理解对于shell编程非常非常重要。同样清楚地了解脚本的哪些部分与shell相关,哪些部分与命令的内容相关(本例中为awk
,或sed
或perl
或......)看到了。