Unix: добавьте каждый элемент второго столбца к каждому элементу первого - PullRequest
0 голосов
/ 07 июля 2019

Я не опытный программист, и я не смог найти решение для следующего. Извините, если я произнесу это неправильно (это может быть проблемой с моим поиском)

У меня есть два файла с одним столбцом

A
B
C

и

X
Y
Z

Я хотел бы создать один файл, который добавляет каждый элемент второго столбца к каждому из первого, чтобы получить:

AX
AY
AZ
BX
BY
BZ
CX
CY
CZ

Порядок результата не важен (например, AX, BX, ... будет в порядке).

В большинстве примеров, которые я вижу, используются вырезать и вставлять, но это только часть решения, которое я ищу.

Я открыт для любого метода, но если это возможно сделать в оболочке bash, я бы предпочел это.

Большое спасибо.

JPG

Ответы [ 3 ]

1 голос
/ 07 июля 2019

Можно сделать так:

#!/usr/bin/env sh

file1='a.txt'
file2='b.txt'

array2="$(cat "${file2}")"

for i in $(cat "${file1}"); do
  for j in ${array2}; do
    echo "${i}${j}"
  done
done
0 голосов
/ 08 июля 2019

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

awk '
    FNR == NR {a[i++] = $1}
    FNR < NR {b[j++] = $1}
    END { 
        for (i in a)
            for (j in b)
                printf "%s%s\n", a[i], b[j] }
' file1 file2

Команда работает, сравнивая FNR (номер записи в файле) с NR (общее количество записей). Если они равны, вы читаете первый файл, сохраняете строки в массиве a. Если NR > FNR, вы читаете второй файл, сохраните строки в массиве b. В пределах END просто выводите массивы, используя вложенные циклы для желаемого вывода. (вы можете добавить проверку в начале END, например, if (i != j), чтобы проверить равное количество записей из каждой, если это является критерием)

Учитывая, что ваши два файла, показанные как file1 и file2, приведут к следующему выводу:

AX
AY
AZ
BX
BY
BZ
CX
CY
CZ

(вы можете просто выбрать команду awk и затем вставить ее средней кнопкой мыши, например, в свой терминал)

$ awk '
>     FNR == NR {a[i++] = $1}
>     FNR < NR {b[j++] = $1}
>     END {
>         for (i in a)
>             for (j in b)
>                 printf "%s%s\n", a[i], b[j] }
> ' file1 file2
AX
AY
AZ
BX
BY
BZ
CX
CY
CZ
0 голосов
/ 07 июля 2019

Это вероятно будет медленно с большим файлом, но это тоже работает:

cat file1.txt | xargs -d ' ' -I var sh -c 'for i in `cat file2.txt`; do echo var$i; done'
AX
AY
AZ
BX
BY
BZ
CX
CY
CZ

EDIT это может быть более эффективным, если записать содержимое второго файла в первую переменную

SECOND_FILE=$(cat file2.txt) | cat file1.txt | xargs -d ' ' -I var sh -c 'for i in `echo $SECOND_FILE`; do echo var$i; done'

Если вы хотите узнать об этой команде и других, я рекомендую объяснение оболочки

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