как скопировать столбец из другого файла при совпадении идентификатора

Ошибки печатаются на stderr , но результаты печатаются на stdout . Вы можете перенаправить ошибки так, чтобы их не было видно:

find / -type d -name 'force_fields' 2>/dev/null
-121--198319-

Эти сообщения записываются через стандартный канал ошибок (номер 2). Вы можете перенаправить сообщение об ошибке на /dev/null , чтобы избежать их:

find / -type d -name 'force_fields' 2>/dev/null
-121--198320-

Да, темно-синий на черном не читается.

Найдите строку в сценарии ~/.bashrc или ~/.zshrc или другом сценарии профиля, который выглядит следующим образом:

eval $(dircolors)

и измените ее на

eval $(dircolors -p | sed -e 's/DIR 01;34/DIR 01;36/' | dircolors /dev/stdin)

синий («01; 34») на голубой («01; 36»)

Либо отредактируйте цветовую схему программы терминала и измените темно-синий цвет на более читаемый.

0
03.05.2018, 22:11
2 ответа

Попробуйте:

awk 'FNR==NR{seen[$1]=$2; next} seen[$NF]{print $0, seen[$NF]}' file2 file1

С помощью ключа столбца $1 сохраните соответствующее значение столбца $2 в связанный массив с именем , видимый , когда awk читает только из файла2 , гдеNR==FNR(всегда верно для первого входного файла, когда есть несколько входных файлов для чтения ), NRбудет установлено в 1 для первой записи/строки, прочитанной awk и увеличивается до тех пор, пока не будут прочитаны все записи/строки, если они одиночные входной файл или несколько файлов; FNRустановит значение 1 для первой записи/строки, считанной с помощью awk , и будет увеличиваться до тех пор, пока все записи/строки не будут прочитаны в текущем входном файле, и не будет сброшено обратно на 1 для следующего файла.

Следующий блок, если значение последнего столбца совпадает с тем же значением ключа в видимом массиве, затем напечатать всю строку из файла1 и значение того же ключа в массиве.

2
28.01.2020, 02:15

Предположим, что поле, в котором вы хотите объединить/объединить данные, отсортировано:

$ join -1 4 -o1.1,1.2,1.3,0,2.2 file1 file2
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0

Это объединяет два файла в четвертом столбце file1(, указанном с помощью -1 4, так как это не первый столбец в этом файле )и первый столбецfile2(это столбцы, которые нужны файлам для сортировки по ).

Флаг -oуказывает joinкакие поля мы хотели бы видеть в выводе и из какого файла их брать(1.3означает "третье поле из первого файла", например, а 0означает поле соединения ).

Преимущество использования joinзаключается в том, что ни один файл не нужно полностью считывать в память.


Если файлы не отсортированы, вы можете либо предварительно -отсортировать их раз и навсегда с помощью

sort -k4 -o file1 file1
sort     -o file2 file2

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

join -1 4 -o1.1,1.2,1.3,0,2.2 <( sort -k4 file1 ) <( sort file2 )

Именно отсортированные данные позволяют joinодновременно хранить в памяти только несколько строк каждого файла.

4
28.01.2020, 02:15

Теги

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