如何用BASH中的另一个文件中的相应行填充一个文件中的空行?

时间:2014-03-01 05:04:18

标签: bash awk cut

我有两个文件,file1.txtfile2.txt。每个都有相同数量的行,但file1.txt中的某些行是空的。当两个文件的内容并行显示时,这是最容易看到的:

file1.txt     file2.txt
cat           bear
fish          eagle
spider        leopard
              snail
catfish       rainbow trout
              snake
              koala
rabbit        fish

我需要将这些文件组合在一起,以便file1.txt中的空行填充在file2.txt的行(相同行号)中找到的数据。 file3.txt中的结果如下所示:

cat
fish
spider
snail
catfish
snake
koala
rabbit

我能做的最好的事情就是创建一个while read -r line循环,创建一个计算while循环循环次数的计数器,然后使用if条件检查$line是否为cut为空,然后根据计数器上的数字使用file2.txtfile2.txt获取行号。这种方法似乎效率很低。

  • 有时file1.txt可能包含一些空行。如果file2.txt有一个空行且file3.txt在同一个地方也有一个空行,则结果是{{1}}中的空行。

如何使用另一个文件中的相应行填充一个文件中的空行?

6 个答案:

答案 0 :(得分:4)

paste file1.txt file2.txt | awk -F '\t' '$1 { print $1 ; next } { print $2 }'

答案 1 :(得分:4)

以下是使用awk处理这些文件的方法:

awk 'FNR==NR {a[NR]=$0;next} {print (NF?$0:a[FNR])}' file2 file1
cat
fish
spider
snail
catfish
snake
koala
rabbit

首先,它使用记录号作为索引
来存储数组file2a的每个数据 然后打印file1,如果file1包含每条记录的数据,则将其定位 如果有此记录的数据,则使用它,如果没有从file2

获取

答案 2 :(得分:2)

一个使用getline(在这种情况下无害):

awk '{getline p<f; print NF?$0:p; p=x}' f=file2 file1

答案 3 :(得分:1)

只是为了好玩:

paste file1.txt file2.txt | sed -E 's/^   //g' | cut -f1

这将删除位于行开头的标签(从file1中丢失的标签),然后删除第一列。

(对于OSX,\t在sed中不起作用,因此要获取TAB字符,请键入ctrl-V然后键入Tab)

答案 4 :(得分:1)

以下是仅限Bash的解决方案。

for i in 1 2; do
    while read line; do
        if [ $i -eq 1 ]; then
            arr1+=("$line")
        else
            arr2+=("$line")
        fi
    done < file${i}.txt
done
for r in ${!arr1[@]}; do
    if [[ -n ${arr1[$r]} ]]; then
            echo ${arr1[$r]}
    else
            echo ${arr2[$r]}
    fi
done > file3.txt

答案 5 :(得分:1)

没有awk的解决方案:

paste -d"#" file1 file2 | sed 's/^#\(.*\)/\1/' | cut -d"#" -f1