在bash中使用head和tail实用程序合并2个文件

时间:2014-03-18 01:37:18

标签: bash while-loop head tail

我的两个输入文件如下:

111
222
333

555
666

我想合并它们以获得以下输出

111
555
222
666
333

这是我到目前为止所尝试的

i=1
while read line
do
   head -$i $1 | tail -1
   head -$i $2 | tail -1 
   i=$(($i+1));
done < $1

这是我收到的输出

111
555
222
666
333
666

如何防止它两次使用'old'中的最后一行?如果第二个文件大于第一个文件,它也应该能够合并这两个文件。

4 个答案:

答案 0 :(得分:2)

你应该只使用粘贴:

paste -d"\n" /tmp/file1 /tmp/file2

答案 1 :(得分:1)

如果OP实际上只想进行实验headtail,那么这是对其代码的修改:

lenA=`wc -l $1 | awk '{print $1}'`
lenB=`wc -l $2 | awk '{print $1}'`

i=1
while read line
do
   tail -$(($lenA - $i + 1 >= 0?$lenA - $i + 1:0)) $1 | head -1
   tail -$(($lenB - $i + 1 >= 0?$lenB - $i + 1:0)) $2 | head -1
   i=$(($i+1));
done < $1

答案 2 :(得分:1)

以下是仅使用bash的方法:

while true; do    
    read -r newline
    read -r oldline <&3
    if [[ -z "$newline" && -z "$oldline" ]]; then 
        break;
    fi
    if [[ ! -z "$newline" ]]; then 
        echo "$newline"
    fi
    if [[ ! -z "$oldline" ]]; then
        echo "$oldline"
    fi
done <new 3<old

<强>输出:

111
555
222
666
333

答案 3 :(得分:0)

您可以在一个文件上使用BASH read循环并将增量变量传递给awk以从另一个文件中获取相同的行号,以便您可以按照所需的顺序打印它们。 / p>

#!/bin/bash

i=1
while read line; do
    echo $line
    awk -v i=$i 'NR==i' $2
    ((i++))
done < $1