0

我有一个看起来像这样的文件,格式应该是文件名,后跟 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$

谢谢

4

3 回答 3

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
    }'
于 2012-11-01T10:15:03.610 回答
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 "!?"; }'
于 2012-11-01T10:15:13.030 回答
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
于 2012-11-01T11:11:29.247 回答