包括使用模式的空行

时间:2017-02-07 09:46:26

标签: bash awk

我的问题如下:我有一个文本文件,其中没有空行,现在我想根据模式文件包含行,其中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

感谢您的任何提示。

5 个答案:

答案 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
  • 如果模式中的信息少于数据文件中的行,则需要反转值以避免最后一行无限换行
  • multiple 0需要循环+测试
  • 模式和数据文件的文件号之间的unsynchro是一个使用直接数组的问题(除非它保留插入多少新行,另一种方法)