добавление столбца в выходной файл с несколькими записями

В настоящее время это работает только с версией 1.30.0-ish или выше, это не работает на любой текущей версии ubuntu, если вы не собираете из исходников.

virt-sysprep -a CentOS-6-x86_64-GenericCloud-1601.qcow2 --root-password password:asd --ssh-inject root:file:/root/my.key.pub
1
20.03.2019, 21:57
3 ответа

I Выполнено командой ниже

команда

for ((i=1;i<=5;i++)); do j=`awk -v i="$i" 'NR==i{print $1}' g1.txt`;k=`awk -v i="$i" 'NR==i{print $NF}' g1.txt`;awk -v j="$j" -v k="$k" '$1==j{print $1,k,$2,$3,$4}' g2.txt;done

выход

for ((i=1;i<=5;i++)); do j=`awk -v i="$i" 'NR==i{print $1}' g1.txt`;k=`awk -v i="$i" 'NR==i{print $NF}' g1.txt`;awk -v j="$j" -v k="$k" '$1==j{print $1,k,$2,$3,$4}' g2.txt;done

22:50:48] Return_M <0> X led_required
22:50:48] Return_M <0> X start_rules
22:50:48] Return_M <0> X leadstart
22:50:49] Return_A <0> X asynchronous_start
22:50:49] Return_A <0> X controldown
22:50:49] Return_A <0> X select_set(3)
22:50:49] Return_A <0> X limiting_rules
22:50:50] Return_F <0> X stock_manager
22:50:50] Return_F <0> X led_blink
22:50:50] Return_F <0> X start_required
22:50:51] Return_K <0> X control_down
22:50:51] Return_K <0> X select_set(3)
22:50:51] Return_K <0> X start_rules
22:50:52] Return_Y <0> X stock_manager
22:50:52] Return_Y <0> X blink_led
0
27.01.2020, 23:41

Примечание :Это повторное -прохождение моего предыдущего ответа вам(на более новый вопрос, но я пропустил этот вопрос, когда он был свежим)

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

$ join file1 file2
22:50:48] Return_M <0> X led_required
22:50:48] Return_M <0> X start_rules
22:50:48] Return_M <0> X leadstart
22:50:49] Return_A <0> X asynchronous_start
22:50:49] Return_A <0> X controldown
22:50:49] Return_A <0> X select_set(3)
22:50:49] Return_A <0> X limiting_rules
22:50:50] Return_F <0> X stock_manager
22:50:50] Return_F <0> X led_blink
22:50:50] Return_F <0> X start_required
22:50:51] Return_K <0> X control_down
22:50:51] Return_K <0> X select_set(3)
22:50:51] Return_K <0> X start_rules
22:50:52] Return_Y <0> X stock_manager
22:50:52] Return_Y <0> X blink_led

Утилита joinвыполняет реляционную операцию INNER JOIN для двух входных файлов. По умолчанию первый столбец является столбцом соединения, и ввод должен быть отсортирован по этому столбцу .

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

Вы можете изменить этот порядок, используя флаг -oс join(, см. руководство ).

0
27.01.2020, 23:41

Я включил два (слегка различающихся )скрипта, которые должны делать то, что вы хотите :скрипт Python и скрипт Bash.

Решение Python

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
"""prefix_join.py"""

import sys

input_1 = sys.argv[1]
input_2 = sys.argv[2]

# Initialize a list to store prefixes as they occur
prefix_list = list()

# Parse the first input file
data_1 = dict()
with open(input_1, "r") as file_1:
    for line in file_1:

        # Remove trailing and leading whitespace
        line = line.strip()

        # Split the string on the first whitespace character
        prefix, sep, suffix = line.partition(" ")

        # Add the prefix the list of prefixes
        if prefix not in prefix_list:
            prefix_list.append(prefix)

        # Add the prefix to the first data dictionary
        if prefix not in data_1:
            data_1[prefix] = list()

        # Add the suffix to the data dictionary
        data_1[prefix].append(suffix)

# Parse the second input file
data_2 = dict()
with open(input_2, "r") as file_2:
    for line in file_2:

        # Remove trailing and leading whitespace
        line = line.strip()

        # Split the string on the first whitespace character
        prefix, sep, suffix = line.partition(" ")

        # Add the prefix the list of prefixes
        if prefix not in prefix_list:
            prefix_list.append(prefix)

        # Add the prefix to the first data dictionary
        if prefix not in data_2:
            data_2[prefix] = list()

        # Add the suffix to the data dictionary
        data_2[prefix].append(suffix)

# Output the joined data
for prefix in prefix_list:
    for value_1 in data_1.get(prefix, list()):
        for value_2 in data_2.get(prefix, list()):
            output_line = "{} {} X {}".format(prefix, value_1, value_2)
            print(output_line)

Вы бы запустили это так:

python prefix_join.py file-1.txt file-2.txt

Для данных вашего примера он выдает следующий результат:

22:50:48] Return_M X <0> X led_required
22:50:48] Return_M X <0> X start_rules
22:50:48] Return_M X <0> X leadstart
22:50:49] Return_A X <0> X asynchronous_start
22:50:49] Return_A X <0> X controldown
22:50:49] Return_A X <0> X select_set(3)
22:50:49] Return_A X <0> X limiting_rules
22:50:50] Return_F X <0> X stock_manager
22:50:50] Return_F X <0> X led_blink
22:50:50] Return_F X <0> X start_required
22:50:51] Return_K X <0> X control_down
22:50:51] Return_K X <0> X select_set(3)
22:50:51] Return_K X <0> X start_rules
22:50:52] Return_Y X <0> X stock_manager
22:50:52] Return_Y X <0> X blink_led

Решение Баша

#!/usr/bin/env bash
# prefix-join.sh

# Get the input files as command-line arguments
input_file_1="$1"
input_file_2="$2"

# Set the internal field separator to be a newline (don't include spaces or tabs)
IFS=$'\n'

# Iterate over the lines of the first input file
for line_1 in $(cat "${input_file_1}"); do

    # Split the line on the first space
    prefix_1="${line_1/ */}";
    suffix_1="${line_1#*] }";

    # Iterate over the lines of the second input file
    for line_2 in $(cat "${input_file_2}"); do

        # Split the line on the first space
        prefix_2="${line_2/ */}";
        suffix_2="${line_2#*] }";

        # If the prefixes agree, combine the suffixes and output the result
        if [[ "${prefix_1}" = "${prefix_2}" ]]; then
            echo "${prefix_1} ${suffix_1} X ${suffix_2}"
        fi 

    done
done

Вы бы запустили это так:

bash prefix-join.sh file-1.txt file-2.txt

Для данных примера это дает тот же результат, что и сценарий Python.

1
27.01.2020, 23:41

Теги

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