0

このようなxx.txtというファイルがあります。

 1PPYA
 2PPYB
 1GBND
 1CVHA

このファイルの最初の行は「1PPYA」です。私はしたいと思います

  1. 「1PPYA」の最後の文字を読みます。この例では、「A/」です。
  2. 「yy」ディレクトリから「1PPY.txt」(最初の 4 文字)を見つけます。
  3. 「A」文字を含む「csh」で始まる行を削除します。

「yy」ディレクトリに次の「1PPY.txt」があるとします。

 csh    1      A   1      27.704   6.347   
 csh    2      A   1      28.832   5.553  
 csh    3      A   1      28.324   4.589 
 csh    4      B   1      27.506   3.695  
 csh    5      C   1      29.411   4.842 
 csh    6      A   1      28.378   4.899  

必要な出力は次のようになります。

csh  4      B   1      27.506   3.695
csh  5      C   1      29.411   4.842 
4

4 に答える 4

1

あなたのシェルがbashであると仮定します

while read word; do
    if [[ $word =~ ^(....)(.)$ ]]; then
        filename="yy/${BASH_REMATCH[1]}.txt"
        letter=${BASH_REMATCH[2]} 
        if [[ -f "$filename" ]]; then
            sed "/^csh.*$letter/d" "$filename"
        fi
    fi
done < xx.txt

awkで質問にタグを付けたように:

awk '{
    filename = "yy/" substr($1,1,4) ".txt"
    letter = substr($1,5)
    while (getline < filename) 
        if (! match($0, "^csh.*" letter)) 
            print
    close(filename)
}' xx.txt
于 2012-05-11T16:12:47.847 に答える
0

これはあなたのために働くかもしれません:

 sed 's|^ *\(.*\)\(.\)$|sed -i.bak "/^ *csh.*\2/d" yy/\1.txt|' xx.txt | sh

注意:ファイルバックアップを追加しました。これが必要ない場合は-i.bak-i

于 2012-05-11T16:08:34.017 に答える
0

次の bash スクリプトを使用できます。

while read f l
do
   [[ -f $f ]] && awk -v l=$l '$3 != l' $f
done < <(awk '{len=length($0);l=substr($0,len);f=substr($0,0,len-1);print "yy/" f ".txt", l;}' xx.txt)

あなたが新しいユーザーであるため、これを投稿しましたが、何を試し、どこで行き詰まっているかを示す方がはるかに良いでしょう.

于 2012-05-11T13:37:15.377 に答える