Как соединить два файла в Linux?

Вы сказали, что это файл, используйте редактор файлов.

for f in *.txt; do
  printf '%s\n' '-49,$g/pattern/d' w | ed -s "$f"
done

Предполагая, что файлы не пусты, это должно работать, в противном случае добавьте тест внутри цикла, если файл пуст, и игнорируйте/пропускайте его. Это решение фактически отредактирует файлы на месте, поэтому протестируйте некоторые образцы файлов и сначала создайте резервную копию, потому что оно удалит строки с patternиз последних 50 строк.

0
23.11.2020, 14:11
1 ответ

У вас есть одна ошибка, которая означает, что вы пропустите первую строку из файла2. У вас есть как sed 1,1d, который удалит первую строку, заголовок, так и NR>1в awk, который снова пропустит первую строку. Вы, вероятно, хотели этого вместо этого:

join -11 -21 <(cat file1 | sort -k1,1) \
             <(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) |
     awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' 

Тем не менее, все остальное должно работать так, как вы описываете. Я тестировал, используя эти примеры файлов:

$ cat file1
1_4
3_4
4_63
6_2

и

$ zcat file2
CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1  4  78  42   850   284   102   478   199    3777   485  2.5   2.4   23  35  336
1  8  78  42   850   284   102   478   199    3777   485  2.5   2.4   23  35  336

И, как и ожидалось, я получил только одну строку вывода для1_4:

$ join -11 -21 <(cat file1 | sort -k1,1) \
               <(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | 
                    sort -k1,1) | 
    awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' 
1_4 1 4 850 42 677 102 3777 485 284
    

Если это не то, что вы видите, измените свой вопрос и включите пример, который мы можем использовать для воспроизведения ошибки.

1
18.03.2021, 22:47

Теги

Похожие вопросы