2012-05-12 4 views
1

У меня есть 2 файла, как это:Прочитайте несколько файлов и изменения полей

file1

1 2 3 . . .

1 -2 4 . . .

1 2 5 . . .

. . . . . .

. . . . .

файл 2

1 0.33 3 . . .

2 0.14 4 . . .

3 2.155 5 . . .

. . . . . .

. . . . . .

мне нужно проверить построчно условие ($ 1 == 1 & & $ 2 == - 2) в файле1 и изменить соответствующую строку в файле2, с $ 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 

Так что выходной файл должен быть:

1 0.33 3 . . .

2 0.14 8 . . .

3 2.155 5 . . .

. . . . . .

. . . . . .

но похоже, какой символ или пробел модифицируется. Возможно, с Python проще решить эту проблему? Любое предложение?

+0

насчет решения с питоном? –

ответ

0

Поскольку вы спросили о питона

#!/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 
+0

Только 'if (...) f [2] = 8' Большое спасибо! –

0

Вы хотите установить разделитель полей вывода в awk, а также:

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

FYI, команды paste и cut может упростить awk скрипт:

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

Вы берете только первый два поля из каждой строки файла1, используйте paste, чтобы добавить их в начало соответствующей строки в файле2, затем измените поле (соответствует полю 3 в файле2), если это необходимо, и вывести всю строку и, наконец, вычеркнуть поля из файла1.

+0

Решение с комбинацией cut, past и awk очень велико! Кажется, это с первого взгляда.В любом случае, когда я использую выходной файл в качестве входного файла для скрипта python (в котором мне нужно создать массив с определенным полем и матрицей с почти остальными полями), он возвращает «arr = N.array (data, dtype = dtype, copy = copy) ValueError: установка элемента массива с последовательностью. ". Возможно, есть некоторые проблемы с char и float. Таким образом, я полагаю, что лучше перевести этот код непосредственно в python ... Есть ли быстрое решение этой проблемы? Спасибо всем заранее! –

1

Вам не нужно использовать -F, так как вы устанавливаете FS и OFS внутри вашего блока BEGIN.

У вас есть фигурные скобки и скобки на месте.

$ 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 
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 . . . 
. . . . . . 
. . . . . . 

Это, вероятно, ужасно сценариев, я никогда не был хорош в Баш, но я оправдать потраченное впустую время, разместив его.

 Смежные вопросы

  • Нет связанных вопросов^_^