尝试在粘贴命令中添加换行符

尝试在粘贴命令中添加换行符

这是尝试包含换行符的粘贴命令的弱尝试:

    paste -d -s tmp1 tmp2 \n tmp3 \n tmp4 tmp5 tmp6 > tmp7

基本上我在每个 tmp 中有几行,我希望读取输出

First(tmp1) Last(tmp2)
Address(tmp3)
City(tmp4) State(tmp5) Zip(tmp6)

我在粘贴命令中使用换行符是否偏离了基础?

这是我的成品:谢谢您的帮助!

    cp phbook phbookh2p5

    sed 's/\t/,/g' phbookh2p5 > tmp
    sort -k2 -t ',' -d tmp > tmp0
    cut -d',' -f1,2 tmp0 > tmp1
    cut -d',' -f3 tmp0 > tmp2
    cut -d',' -f4,5,6 tmp0 > tmp3
    echo "" > tmp4

    paste -d '\n' tmp1 tmp2 tmp3 tmp4 > tmp7

    sed 's/\t/ /g' tmp7 > phbookh2p5

    cat phbookh2p5

    rm tmp*; rm phbookh2p5

答案1

使用两个额外的临时文件尝试此解决方案:

paste tmp1 tmp2 > tmp12
paste tmp4 tmp5 tmp6 > tmp456
paste -d "\n" tmp12 tmp3 tmp456 > tmp7

该解决方案基于-d选项选择分隔符的假设全球对于所有输入文件,因此它要么是空白或者换行符。在某种程度上这是正确的,因为后来发生的事件-d会覆盖以前的事件。然而,正如 @DigitalTrauma 指出的那样,我们可以提供多个分隔符,这些分隔符将按顺序使用。所以@DigitalTrauma的解决方案比我的更优雅,因为它完全避免了额外的临时文件。

我的解决方案的一个利基应用是这样的情况,其中一个或多个分隔符每个超过一个字符必须使用。仅使用该选项是不可能实现这一点的-d

答案2

我认为paste手册页的这一部分就是您想要的:

   -d, --delimiters=LIST
          reuse characters from LIST instead of TABs

所以这一行应该适合你的情况:

paste -d" \n\n  " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 > tmp7

与@DopeGhoti 的样本数据按预期工作:

$ grep . tmp*
tmp1:Bill
tmp1:Bob
tmp2:Kerman
tmp2:Germin
tmp3:123 Main St.
tmp3:321 Sesame St.
tmp4:Kerbopalis
tmp4:Kerbington
tmp5:Kerbskatchewan
tmp5:Kermont
tmp6:12345
tmp6:31416
$ paste -d" \n\n  " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6
Bill Kerman
123 Main St.
Kerbopalis Kerbskatchewan 12345
Bob Germin
321 Sesame St.
Kerbington Kermont 31416
$ 

paste我已经使用 GNU Coreutils 5.97 和 8.21 以及 BSD (OS X)成功测试了这一点。不确定还有哪些其他版本的粘贴。

答案3

这个命令应该可以工作。

 paste -s tmp1 tmp2 -d '\n' tmp3 -d '\n' tmp4 tmp5 tmp6 > tmp7

答案4

sort -dk2,2 phpbook |
sed "s/\t/\n/3;s//\n/2;s// /g"

据我了解,您有一个名为的文件phpbook,其中包含电话簿条目行,如下所示:

{first}\t{last}\t{address}\t{city}\t{state}\t{zip}

您想要对这些进行排序,在和{last}后面添加换行符,对于每个条目,将abs 翻译为,然后将结果打印到。如果情况并非如此,那么我无法弄清楚你的命令还会做什么 - 但有时我可能会非常密集。 {last}{address}\t<spaces>stdout

您应该注意,默认情况下sort按字符分隔,<TAB>因此:

sed 's/\t/,/g' | sort ... -t ,

...可能不值得这样做。

考虑更多,我想你的分隔符很可能是混合的,并且首字母sed是为了将它们标准化。这就说得通了。也许像:

1,2\t3\t4,5,6

...或者其他的东西。在这种情况下,需要进行某种初始翻译。所以也许...

tr , \\t <phbook | sort ... | sed ...

效果会更好一些。还...

sort ... -k 2

...可能在边缘情况下会出现问题,因为当你使用它时,你sort不会仅有的第二个字段,而是从第二个字段到行尾。一般来说,当人们这样做时,他们确实想要-k2,2这限制了数据sort考虑仅有的第二个字段。

添加辅助键也可能是值得的,例如:

...sort -dk2,2 -k1,1

...这将sort 主要是关于姓氏和其次关于名字。以这种方式泽德·史密斯会跟随阿尔法·史密斯每次。

不管怎样,万一我是对的,sort | sed上面的管道应该能完成全部工作。我假设您sed理解\e我使用的 scapes,但如果不理解,那么您可以尝试将引用的sed脚本替换为:

s/<literal TAB>/\
/3;s//\
/2;s// /g

相关内容