这是尝试包含换行符的粘贴命令的弱尝试:
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