簡體   English   中英

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

[英]How to fill empty lines from one file with corresponding lines from another file, in BASH?

我有兩個文件, 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中的行(相同行號)中的數據file2.txt file3.txt的結果如下所示:

cat
fish
spider
snail
catfish
snake
koala
rabbit

到目前為止我能做的最好的事情是創建一個while read -r line循環,創建一個計算while循環循環次數的計數器,然后使用if-conditional來檢查$line是否為空,然后使用cut to根據計數器上的數字從file2.txt獲取行號。 這種方法似乎效率很低。

  • 有時file2.txt可能包含一些空行。 如果file1.txt有一個空行而file2.txt在同一個地方也有一個空行,則結果是file3.txt的空行。

如何用另一個文件中的相應行填充一個文件中的空行?

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

以下是使用awk處理這些文件的方法:

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

首先,它使用記錄號作為索引將file2每個數據存儲在數組a
然后它打印file1 ,如果file1包含每個記錄的數據,則將其寫入
如果有此記錄的數據,則使用它,如果沒有從file2獲取

一個與getline(在這種情況下無害):

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

純娛樂:

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

這將刪除位於行開頭的選項卡(從file1中丟失的選項卡),然后獲取第一列。

(對於OSX, \\t在sed中不起作用,因此要獲取TAB字符,請鍵入ctrl-V然后鍵入Tab)

這是一個僅限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

沒有awk的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM