Найти дубликат столбца и разделить его на файл или переменную (Bash)

1

У меня есть вывод, как; (Столбцы разделены табуляцией \t)

name1   something1
name1   something2
name1   something3
name2   something4
name2   something5

Для этого вывода мне нужно два выхода (если есть name3, мне нужно 3 выхода), как

name1   something1
name1   something2
name1   something3

а также

name2   something4
name2   something5

Я думаю, что это будет сделано AWK, но я не мог создать волшебные слова.

Каков наилучший способ сделать это?

Мне нужно условие, чтобы прочитать $1«1.column» и распечатать все из них (не удаляя дубликаты), если это не изменится, и напечатать другие столбцы ($ 2, $ 3, ...)

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

makgun
источник

Ответы:

2

Попробуй это:

awk -F'\t' '{print>$1;}' file

После выполнения вышеуказанной команды в каталоге появятся еще два файла:

$ cat name1
name1   something1
name1   something2
name1   something3
$ cat name2
name2   something4
name2   something5

Как это устроено

  • -F'\t'

    Это говорит awk использовать вкладку в качестве разделителя полей.

  • print>$1

    Это говорит awk о том, чтобы печатать каждую строку в файл с именем первого поля.

Удаление недопустимых символов из имен файлов

Предположим, что входной файл выглядит так:

$ cat file
name/1  something1
name/1  something2
name/1  something3
name/2  something4
name/2  something5

Следующий код создает файлы на основе поля имени, но с /удаленным:

awk -F'\t' '{name=$1; gsub(/[/]/, "", name); print>name;}' file

Вышеуказанное было протестировано на GNU awk и успешно запущено. Если ваш awk не принимает, попробуйте:

awk -F'\t' '{name=$1; gsub("/", "", name); print>name;}' file

или же:

awk -F'\t' '{name=$1; gsub(/\//, "", name); print>name;}' file
John1024
источник
1
LOL это элегантно!
Теоден
AWK не может открыть "name1" для вывода? Это не создаст файл?
Макгун
@makgun Это, вероятно, означает, что команда выполняется в каталоге, для которого у вас нет разрешения на запись . Перед выполнением команды перейдите cdв каталог, которым вы владеете.
John1024
Я нахожусь на $ HOME в моем bash-shell
makgun
Причиной проблемы для метасимволов, которые не разрешены системой, называются такие файлы, как: /
makgun
0

Я думаю, что это должно работать:

mkdir tmp; cd tmp
while IFS= read line; do
    echo "$line" >> $(echo "$line" | awk '{print $1}')
done
cat *

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

Если вы хотите передать его в переменную:

while IFS= read line; do
    key="$(echo "$line" | awk '{print $1}')"
    eval "INPUT_$key='\$INPUT_$key\$line'"
done

Если у вас есть большие требования, используйте:

#!/usr/bin/python

import sys
import re

for line in sys.stdin:
    f = open(re.split("\s+", line, 1), 'a')
    f.write(line)
    f.close()

Это будет работать Должен. Это не может подвести.

Теоден
источник
При этом он печатает всего 1 доллар и не найдет последнюю строку, если она изменится
makgun
@makgun, это будет, если вы нажмете ввод.
Теоден
Я создал скрипт bash и добавил его в файл с добавлением < <(cat $file)после, doneно это не сработало
makgun
@makgun, если вы планируете использовать всевозможные символы на всех платформах, не используйте bash/ awk/ gawk/ etc, используйте perl/ python.
Теоден
Я не знаю, как работает фитон, и мне нужно изменить все предыдущие команды, чтобы получить мой первый вывод
makgun