Unix 如何将额外字段与输入文本连接起来

Unix 如何将额外字段与输入文本连接起来,unix,Unix,输入文本将是: 9842901121 9942501133 9942501199 9942501133 9842901121 首先,输入文件应仅使用唯一的行进行排序。 然后输出为 '9842901121',()(now, '9942501133',()(now, '9942501199',()(now, 如果我们在Unix命令行上使用“单引号”,则提示转到>。 为什么?如何避免该问题?使用如下脚本: #!/bin/sh sort "$1" | uniq | ( while read l

输入文本将是:

9842901121 9942501133 9942501199 9942501133 9842901121 首先,输入文件应仅使用唯一的行进行排序。 然后输出为

'9842901121',()(now, '9942501133',()(now, '9942501199',()(now, 如果我们在Unix命令行上使用“单引号”,则提示转到>。
为什么?如何避免该问题?

使用如下脚本:

#!/bin/sh

sort "$1" | uniq | (
    while read line; do
        echo "'$line',()(now,"
    done
)
将其保存在名为test.sh的文件中,然后像sh test.sh filetoprocess一样运行它。

使用sort和sed:

不得不说,这是一个非常奇怪的字符串连接到任何东西的末尾

shell提示符更改为“>”的原因是它认为您尚未完成 命令它称为辅助提示符,可通过$PS2变量进行设置。例如,如果我键入:

$ sort -u input.file |
> sed "s/.*/'&',()(now,/"
'9842901121',()(now,
'9942501133',()(now,
'9942501199',()(now,
$
当我在管道符号后点击return时,shell知道该命令不完整,因此它请求输入的其余部分——在本例中是sed命令

我在sed脚本周围使用了引号(这次是双引号)来告诉shell参数的结束位置。如果没有这些,我会得到一个语法错误,但是可以想象,shell会误解一些东西,认为命令不完整。我通常在正则表达式字符串周围使用单引号;总的来说,没什么可担心的。但这一次,替换文本包含单引号,然后在整个字符串周围使用单引号需要:

sort -u input.file | sed 's/.*/'\''&'\'',()(now,/'
这比双引号的版本更难写,也更难读

从评论中:

在上面的命令中,我不能在数字之前和之后添加“但其他命令可以正常工作”

请不要虐待猫。 请记住sort-u比sort | uniq快。 仅供参考:世界上有不区分大小写的文件系统。 也许您输入了Inputfile1.txt的拼写错误。 除非您需要中间文件,否则只需将排序阶段的输出导入“mangle”阶段。 正如我在主要回答中指出的,你必须非常小心引用,尤其是当你想打印它们的时候。 只有当一行上有多个字段且分隔符不是“空白”空格或制表符时,才需要awk的-F选项。 使用awk代替sed是完全可行的;我们只需要小心报价。问题是,awk脚本本身需要包含单引号和双引号,这意味着您必须非常小心。我建议使用sed,因为您不必在脚本中同时使用单引号和双引号

sort -u inputfile.txt |
awk '{printf "'\''%s'\'',()(now,\n", $0}'
第一个单引号开始一个单引号字符串;单引号字符串中没有特殊字符,后面的第一个单引号将终止该字符串。因此,第一个双引号只是一个常规字符。第二个单引号是要记住的序列的开始:'\。第一个单引号终止当前单引号字符串;反斜杠单引号组合将单引号嵌入字符串中;序列中的第三个单引号将启动一个新的单引号字符串。在此之后,%s是字符串的一部分,然后还有另一个“\sequences”将另一个单引号输入脚本;然后是printf格式字符串的其余部分,后面是最后一个单引号。通过用单引号括起来,我们不必担心在字符串中转义双引号、反勾号、反斜杠和美元符号。最终结果是awk看到程序文本:

{printf "'%s',()(now,\n", $0}
它使用单引号打印输入数据,并在输入数据后面加上“now”序列,以换行符结尾

你能在程序中用双引号写出来吗?是的,你当然可以:

sort -u inputfile.txt |
awk "{printf \"'%s',()(now,\\n\", \$0}"
这实际上比单引号的版本短两个字符,但有更多的机会出错。对于单引号,我所需要做的就是将脚本中出现的每个单引号替换为“\序列;使用双引号时,我还必须担心其他特殊字符的转义


对单引号和双引号的良好理解对于shell编程非常非常重要。同样,也要清楚地了解脚本的哪些部分与shell所看到的内容相关,哪些部分与本例中的命令awk、sed、perl或。。。请参阅。

您到底想从unix命令提示符对文件进行排序并删除重复项,这是什么意思?我认为您需要花点时间来正确解释您的问题以及您试图如何解决这个问题,也许可以使用编辑器工具为您的问题添加一些格式。否则,人们只会忽略你的问题。cat inputfie.txt | sort | uniq>Inputfile.txt awk-F'{print echo$1,now,}'Inputfile1.txt在上面的命令中,我无法添加'在数字前后,但其他命令都可以正常工作。请帮助解决..@user394741:在堆栈溢出上,你表示感谢的方式是向上投票有用的答案,接受最有帮助的答案。参见常见问题。@user394741:我不知道你在说什么。
{printf "'%s',()(now,\n", $0}
sort -u inputfile.txt |
awk "{printf \"'%s',()(now,\\n\", \$0}"