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

时间:2010-12-23 21:43:35

标签: unix

输入文字为:

9842901121
9942501133
9942501199
9942501133
9842901121

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

'9842901121',()(now,
'9942501133',()(now,
'9942501199',()(now,

如果我们在U​​nix命令行上使用'(单引号),则提示符转到>。 为什么?我们如何避免这个问题?

2 个答案:

答案 0 :(得分:0)

使用这样的脚本:

#!/bin/sh

sort "$1" | uniq | (
    while read line; do
        echo "'$line',()(now,"
    done
)

将其保存在名为test.sh的文件中,然后像sh test.sh filetoprocess一样运行。

答案 1 :(得分:0)

使用sortsed

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
     

在上面的命令中,我无法在数字之前和之后添加',但其他人工作正常。

  1. 请勿滥用cat
  2. 请注意sort -usort | uniq更快。
  3. 仅供参考:世界上有不区分大小写的文件系统。
  4. 也许您输入了Inputfile1.txt。
  5. 除非您需要中间文件,否则只需将排序阶段的输出传输到“mangle”阶段。
  6. 正如我在主要答案中所说,你必须非常小心引用,特别是当你想要打印时。
  7. 只有当一行中有多个字段且分隔符不是“空格”(空格或制表符)时,才需要-F awk选项。
  8. 使用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,或sedperl或......)看到了。