1

私はこれらのような2つのファイルを持っています:

file1

123。。。

1-24 。。。

125。。。

。。。。。。

。。。。。

ファイル2

10.333。。。

20.144。。。

32.1555。。。

。。。。。。

。。。。。。

file1の条件($ 1 == 1 && $ 2 ==-2)を行ごとに確認し、file2の対応する行を$ 3=-2で変更する必要があります。

私が試しているのは:

awk -F '\t' '{ BEGIN { FS=OFS="\t" } if ($1==1 && ($2==-2) {getline < "file2" ; $3=8; print $0} else {getline < "file2" ; print $0}  }' file1

そのため、出力ファイルは次のようになります。

10.333。。。

20.148 。_ 。。

32.1555。。。

。。。。。。

。。。。。。

しかし、一部の文字またはスペースが変更されているようです。たぶんPythonを使えば、この問題に取り組むほうが簡単ですか?なにか提案を?

4

4 に答える 4

1

ブロック内で-F設定FSしているので、使用する必要はありません。OFSBEGIN

中かっことかっこがずれています。

$ awk 'BEGIN { FS = OFS = "\t" } {if ($1 == 1 && $2 == -2) {getline < "file2"; $3 = 8} else {getline < "file2"}; print  }' file1
1   0.33    3
2   0.14    8
3   2.155   5
于 2012-05-12T19:26:55.957 に答える
0

出力フィールドセパレータawkも次のように設定します。

awk -F '\t' -v OFS='\t' ' { if ... }' file1

参考までに、pasteandコマンドを使用するとスクリプトcutを簡略化できます。awk

cut -f1,2 file1 | paste - file2 | \
awk -F '\t' -v OFS '\t' '$1==1 && $2==-2 {$5=8}; {print}' | \
cut -f3-

file1の各行から最初の2つのフィールドだけを取得し、それを使用pasteしてfile2の対応する行の先頭に追加し、必要に応じてフィールド5(file2のフィールド3に対応)を変更して行全体を出力し、最後にストリップします。 file1からフィールドを取り出します。

于 2012-05-12T18:50:06.943 に答える
0

bash&でやったsedのですが、理由はわかりません(ただしbash、質問にタグが付いているので、ちょっと話題になっています):

$ cat /tmp/1
1   2   3   .   .   .
1   -2  4   .   .   .
1   -2  5   .   .   .
.   .   .   .   .   .
.   .   .   .   .

(タブ区切り)

$ cat /tmp/2
1   0.33    3   .   .   .
2   0.14    4   .   .   .
3   2.155   5   .   .   .
.   .   .   .   .   .
.   .   .   .   .   .

$ lines=`grep -n "^1      -2      " /tmp/1 | sed 's/:.*//'`
$ for l in $lines; do sed -ri "${l}s/^(\S*)\t(\S*)\t\S*/\1\t\2\t8/" /tmp/2; done
$ cat /tmp/2
1   0.33    3   .   .   .
2   0.14    8   .   .   .
3   2.155   8   .   .   .
.   .   .   .   .   .
.   .   .   .   .   .

これは恐らくひどいスクリプトです。私はbashが得意ではありませんが、投稿することで無駄な時間を正当化します。

于 2012-05-12T20:08:45.557 に答える
0

Pythonについて質問したので

#!/usr/bin/env python

with open('f1') as  fd:
    f1 = [map(int,i.strip().split()) for i in fd]
with open('f2') as  fd:
    f2 = [map(float,i.strip().split()) for i in fd]

for n, f in enumerate(f2):
    if f1[n][0] == 1 and f1[n][1] == -2:
        print f[0], f[1], 8
    else:
        print f
于 2012-05-12T22:44:58.870 に答える