[英]How to fill empty lines from one file with corresponding lines from another file, in BASH?
我有两个文件, file1.txt
和file2.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.