用于简单文本文件修改的unix脚本

时间:2012-11-01 09:58:06

标签: bash unix

我有一个看起来像这样的文件,格式应该是文件名后跟4个条目开始!.......

76669667-LD_TTFI9255.gz
!0c0901$
!02342e$
!0c0901$
!030c2a$
76669707-UN_TTFI5494.gz
!0c0901$
!030509$
76669731-IN_TTFI7570.gz
!0c0901$
!023633$
!0c0901$
!030e33$

我需要一个命令,它会找到文件名后面少于4个条目并添加一些空格的情况。

使用上面的示例新输出需要成为

76669667-LD_TTFI9255.gz
!0c0901$
!02342e$
!0c0901$
!030c2a$
76669707-UN_TTFI5494.gz
!0c0901$
!030509$
!?
!?
76669731-IN_TTFI7570.gz
!0c0901$
!023633$
!0c0901$
!030e33$

由于

3 个答案:

答案 0 :(得分:1)

假设你很乐意使用的不仅仅是sed,awk或bash ......

以下Perl脚本可以解决这个问题:

cat input.txt | perl -pe '
    if (/^!/) {
        --$n
    } else {
        print "!?\n" x $n if $n > 0
        $n = 4
    }
    END {
        print "!?\n" x $n if $n > 0
    }'

答案 1 :(得分:1)

awk 'BEGIN {counter = 4}
     /^!/ {counter++; print}
     /^[^!]/ { for(i = counter; i<4; i++) print "!?"; print; counter=0; }
     END { for(i = counter; i<4; i++) print "!?"; }'

答案 2 :(得分:1)

纯粹的bash解决方案。没有其他答案中的代码重复:)

#!/bin/bash
count=0
while read line
do
  if [[ ! "$line" =~ ^! ]]
  then
      for((;count>0;count--))
      do
        echo "!?"
      done
      count=4
  else
      ((count--))
  fi
  echo "$line"
done < file