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 に答える