Как объединить файлы с разделителями табуляции?

Я также столкнулся с той же проблемой. Всякий раз, когда я пытался отключиться от VPN (в моем случае это был PPTP) сервер, KDE Network Manager занимает 100% процессор. Раньше я убивал KDE4 из «Системного монитора». Но даже получение там занимает много времени, потому что вся система ведет себя медленно к любой активности.

Нашел немало ошибок, сообщаемых для этой проблемы. Тот, который я упоминаю здесь, даст нам более подробную информацию о проблеме: https://bugs.kde.org/show_bug.cgi?id=268038

Чтобы решить проблему, несколько дней назад у меня было проверить «предварительные обновления» с программных сокетов -> происхождение в Kpackagekit. Было установлено несколько обновлений, и проблема была исправлена.

Из вышеуказанного билета кажется, что обновления уже есть в обновлениях Kubuntu, и вам, вероятно, не нужно устанавливать эти предварительные обновления. Просто проверьте, доступно ли вам какое-либо обновление или нет.

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

1
задан 12 April 2016 в 14:11

4 ответа

Классическим инструментом UNIX для этого является join:

NAME
       join - join lines of two files on a common field

SYNOPSIS
       join [OPTION]... FILE1 FILE2

DESCRIPTION
       For  each  pair of input lines with identical join fields, write a line
       to standard output.  The default join field is the first, delimited  by
       blanks.

Однако join i) нуждается в том, чтобы его вход был отсортирован для работы, и ii) может иметь дело только с 2 файлами , Итак, вы можете сделать что-то уродливое и неэлегантное:

Сортируйте каждый файл во втором поле и сохраните его как новый файл
sort -k2 file1 > sorted1
sort -k2 file2 > sorted2
sort -k2 file3 > sorted3
Присоедините файлы 1 и 2 к новому файлу, а затем присоединитесь к третьему
$ join -j2 --nocheck-order sorted1 sorted2 > newfile
$ join -o 1.2,1.3,2.1,1.1  -1 1 -2 2 --nocheck-order newfile sorted3 
10 3 9 Hac.2
1 33 23 Hhe.7
2 15 70 Hpyl.1
Используемые опции:
   -1 FIELD
          join on this FIELD of file 1

   -2 FIELD
          join on this FIELD of file 2
   -j FIELD
          equivalent to '-1 FIELD -2 FIELD'

   --nocheck-order
          do not check that the input is correctly sorted

   -o FORMAT
          obey FORMAT while constructing output line
   FORMAT is one or more  comma  or  blank  separated
   specifications, each being 'FILENUM.FIELD' or '0'. 
Таким образом, эта команда будет соединяться в первом поле первого файла и втором поле второго файла и будет печатать второе поле первого файла (1.2), затем третье поле первого файла (1.3), первое поле второго файла (2.1) и первое поле первого файла (1.1).

В качестве альтернативы вы можете комбинировать целая вещь в одной славно сложной команде:

$ join -o 1.1,2.2,2.3,2.1 -1 2 -2 1  --nocheck-order <(sort -k2 file3) \
      <(join -j2  --nocheck-order <(sort -k2 file1) <(sort -k2 file2)) 
9 10 3 Hac.2
23 1 33 Hhe.7
70 2 15 Hpyl.1

Если вам не нравится arcane command line-fu, вы всегда можете использовать небольшой скрипт:

[ f6]
4
ответ дан 23 May 2018 в 12:13

Это задание для join, которое может объединяться в общие поля двух файлов:

$ join -11 -22 -o1.2,1.3,2.1,0 <(join -j2 <(sort -k2,2 f1.txt) <(sort -k2,2 f2.txt)) <(sort -k2,2 f3.txt)
10 3 9 Hac.2
1 33 23 Hhe.7
2 15 70 Hpyl.1

Поскольку join принимает только два входных файла за раз, мы использовали замену процесса (<()), чтобы передать вывод join первых двух файлов с третьим.

3
ответ дан 23 May 2018 в 12:13

С awk:

awk -F"\t" -v OFS="\t" '!(a[$2]){a[$2]=$1;next}
{a[$2]=a[$2]"\t"$1} 
END{
for ( i in a) {
    print a[i],i
    }
}'
1
ответ дан 23 May 2018 в 12:13

От: скрипт оболочки

- объединить некоторые файлы с разделителями табуляции - Unix & amp; Linux Stack Exchange Следующий скрипт должен выполнить внешнее соединение в столбце (поле) 1 всех файлов с разделителями табуляции, переданных в качестве аргументов. Он использует команду join, которая выполняет внешнее объединение в отсортированных файлах, по 2 файла за раз. Он будет присоединяться к каждой строке в файлах, включая строки заголовков. Если вы хотите, чтобы заголовки были исключены, измените две команды sort на то, что создает отсортированный файл, который их не дает.
#!/bin/sh
if test $# -lt 2
then
    echo usage: gjoin file1 file2 ...
    exit 1
fi
sort -t $'\t' -k 1 "$1" > result
shift
for f in "$@"
do
    sort -t $'\t' -k 1 "$f" > temp
    join -1 1 -2 1 -t $'\t' result temp > newresult
    mv newresult result
done
cat result
rm result temp
Если у вас установлена ​​более старая оболочка, $'\t' не будет заменена вкладкой, поэтому вам нужно будет использовать «TAB», где вы помещаете литеральную вкладку между кавычками. Оптимизации возможны, если вместо /bin/sh вы можете использовать современную оболочку, такую ​​как bash или ksh; например, строки
sort -t $'\t' -k 1 "$f" > temp
join -1 1 -2 1 -t $'\t' result temp > newresult
можно заменить на
join -1 1 -2 1 -t $'\t' result <(sort -t $'\t' -k 1 "$f") > newresult
0
ответ дан 23 May 2018 в 12:13

Другие вопросы по тегам:

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