0

我有一个文件,xx.txt,像这样。

 1PPYA
 2PPYB
 1GBND
 1CVHA

该文件的第一行是“1PPYA”。我想

  1. 读“1PPYA”的最后一个字符。在这个例子中,它是“A/”
  2. 从“yy”目录中找到“1PPY.txt”(前四个字符)。
  3. 删除以“csh”开头的包含“A”字符的行。

给定“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

假设你的 shell 是 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

您可以使用此 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 回答
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

发射器:

@(next "xx.txt")
@(collect)
@*prefix@{suffix /./}
@  (next `yy/@prefix.txt`)
@  (collect)
@    (all)
@{whole-line}
@    (and)
@      (none)
@shell @num @suffix @(skip)
@      (end)
@    (end)
@  (do (put-string whole-line) (put-string "\n"))
@  (end)
@(end)

跑:

$ txr del.txr
csh    4      B   1      27.506   3.695  
csh    5      C   1      29.411   4.842 
txr: unhandled exception of type file_error:
txr: (del.txr:5) could not open yy/2PPY.txt (error 2/No such file or directory)

由于外部@(collect)/@(end)(很容易删除),它处理来自 的所有行xx.txt,而不仅仅是第一行,所以它爆炸了,因为我没有2PPY.txt.

于 2012-05-11T16:41:35.610 回答