2016-07-26 77 views
-2
>cat tmp1 

1 

2 

3 

>cat tmp2 

vol1 

vol2 

壳两个文件希望这个答案合并在像粘贴命令

vol1 1 

vol1 2 

vol1 3 

vol2 1 

vol2 2 

vol2 3 
+1

请格式化正确的问题,检查[问]并显示你的努力。 – fedorqui

+0

这完全不同于'paste'命令... – Kusalananda

回答

0

只是找到了一种方法做,

for file in `cat tmp1` 
do 
     for f in `cat tmp2` 
     do 
       echo $file $f 
     done 
done 
+0

[不要用'for for'读取行](http://mywiki.wooledge.org/DontReadLinesWithFor)。另外,通常最好使用文本处理工具。 –

1

如果行的顺序不是那么重要

awk 'FNR==NR{a[$0];next}{for(i in a){print $0,i}}' tmp2 tmp1 

如果要恢复订单:

awk 'FNR==NR{a[FNR]=$0;l=FNR;next}{for(i=1;i<=l;i++){print $0,a[i]}}' tmp2 tmp1 
+0

我不知道你为什么要特别提出'nawk';这应该在任何版本中工作。您可以在第一个块中使用'a [++ n] = $ 0'来跟踪行数。 –

1
$ while read a; do while read b; do echo $a $b; done<tmp1; done<tmp2 
vol1 1 
vol1 2 
vol1 3 
vol2 1 
vol2 2 
vol2 3 

或者用一个更好的缩进:

while read a; do 
    while read b; do 
     echo $a $b 
    done <tmp1 
done <tmp2 

对于在tmp2文件中的每个字,回声它随后在tmp1文件中的每个字。

如果在这两个文件中的实际数据包含反斜杠,或者如果tmp2文件包含在第一列破折号,那么下面会有一个更好更强大的解决方案:

while read -r a; do 
    while read -r b; do 
     printf '%s %s\n' "$a" "$b" 
    done <tmp1 
done <tmp2 
+0

我建议总是使用'read -r'并引用你的变量。另外,请考虑使用'printf'%s%s \ n'“$ a”“$ b”'。 –

+0

@TomFenech你说得对,但我们得到了一组特定的数据。不过,我会更新答案。 – Kusalananda

+0

@TomFenech在这种情况下使用printf有什么好处?另外,因为变量是否包含空格并不重要,在这种情况下,引用严格来说是不必要的。 – Kusalananda