Bash разделить и отсортировать по двум столбцам в одном файле - PullRequest
0 голосов
/ 17 июня 2019

Для моего файла, который выглядит следующим образом:

AABBCC    10    5    CCAABB    100
BBCCAA    4     2    AABBCC    50
CCAABB    16    8    BBCCAA    20

... Я пытаюсь отсортировать столбцы 4 и 5, сопоставляя столбец 4 с столбцом 1.

В идеале это будетreturn:

AABBCC    10    5    AABBCC    50
BBCCAA    4     2    BBCCAA    20
CCAABB    16    8    CCAABB    100

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

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

3 голосов
/ 17 июня 2019

awk решение:

awk 'NR==FNR{ a[$4]=$5; next }$1 in a{ print $1,$2,$3,$1,a[$1] }' file1 OFS="\t" file1

Выход:

AABBCC  10      5       AABBCC  50
BBCCAA  4       2       BBCCAA  20
CCAABB  16      8       CCAABB  100

В конце вы можете передать sort: ... | sort

2 голосов
/ 17 июня 2019

С bash и GNU paste:

С временными файлами для иллюстрации:

cut -f 1-3 file | sort > file_1to3
cut -f 4-5 file | sort > file_4to5
paste -d '\t' file_1to3 file_4to5

Без временных файлов:

paste -d '\t' <(cut -f 1-3 file | sort) <(cut -f 4-5 file | sort)

Вывод:

AABBCC  10      5       AABBCC  50
BBCCAA  4       2       BBCCAA  20
CCAABB  16      8       CCAABB  100
2 голосов
/ 17 июня 2019
join -t $'\t' -o 1.1,1.2,1.3,2.1,2.2 <(cut -f1-3 file.tsv | sort -k 1,1) <(cut -f4- file.tsv | sort -k 1,1) | sort

Вырежьте исходный файл, затем присоединитесь к первому полю обоих. Нам нужно указать полные поля объединения в -o, чтобы сохранить первый столбец, или join будет использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...