我的问题如下:我有一个文本文件,其中没有空行,现在我想根据模式文件包含行,其中1表示打印行而不包括新行,0 - 包括一个新行。我的文本文件是:
apple
banana
orange
milk
bread
模式文件是:
1
1
0
1
0
1
1
欲望输出相应地:
apple
banana
orange
milk
bread
我尝试的是:
for i in $(cat pattern file);
do
awk -v var=$i '{if var==1 {print $0} else {printf "\n" }}' file;
done.
但它首先打印所有行,然后才更改$i
感谢您的任何提示。
答案 0 :(得分:2)
将模式文件读入数组,然后在处理文本文件时使用该数组。
awk 'NR==FNR { newlines[NR] = $0; next}
{ print $0 (newlines[FNR] ? "" : "\n") }' patternfile textfile
答案 1 :(得分:1)
这有点像黑客,但我把它作为传统awk-y解决方案的替代方案:
paste -d, file.txt <(cat pattern | tr '\n' ' ' | sed 's,1 0,10,g' | tr ' ' '\n' | tr -d '1') | tr '0' '\n' | tr -d ','
输出如下:
apple
banana
orange
milk
bread
答案 2 :(得分:1)
Barmar的反转,将文本读入数组,然后在处理模式时打印:
$ awk 'NR==FNR {fruit[NR]=$0; next} {print $0?fruit[++i]:""}' fruit.txt pattern.txt
apple
banana
orange
milk
答案 3 :(得分:1)
仅使用bash的答案:
i=0; mapfile file < file
for p in $(<pattern); do
((p)) && printf "%s" "${file[i++]}" || echo
done
答案 4 :(得分:1)
允许多个0在1
之间自我记录的代码
awk '# for file 1 only
NR==FNR {
#load an array with 0 and 1 (reversed due to default value of an non existing element = 0)
n[NR]=!$1
# cycle to next line (don't go furthier in the script for this line)
next
}
# at each line (of file 2 due to next of last bloc)
{
# loop while (next due to a++) element of array = 1
for(a++;n[a]==1;a++){
# print an empty line
printf( "\n")
}
# print the original line
print
}' pattern YourFile