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, ...)

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

2 ответа2

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
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()

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .