Как объединить строки из двух файлов? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть файл1:

1
5
4

и файл 2:

44
65
56

Я хочу в file.out:

1
44
5
65
4
56

Спасибо

Ответы [ 3 ]

4 голосов
/ 08 апреля 2019

использовать paste с пользовательским разделителем \n т.е. перевод строки:

paste -d '\n' file1 file2 > file.out

или GNU sed:

sed 'R file2' file1

или awk:

awk 'NR==FNR{a[NR]=$0;next} {print a[FNR]} 1' file1 file2
3 голосов
/ 08 апреля 2019

paste - лучший способ, но с помощью awk вы можете использовать getline для чтения из другого файла при чтении какого-либо файла:

awk -v f2="file2" '{print; getline < f2; print;}' file1
1 голос
/ 08 апреля 2019

Не могли бы вы попробовать следующее решение, оно будет работать для более чем 2 Input_file (s), если у вас есть тоже.

awk 'FNR==NR{a[FNR]=$0;next} {a[FNR]=(a[FNR]?a[FNR] ORS:"")$0} END{for(i=1;i<=FNR;i++){print a[i]}}'  Input_file1  Input_file2


РЕДАКТИРОВАТЬ: Добавление 1 более общего решения, в котором мы могли бы передать ему N файлов, более того, это НЕ предполагает, что количество строк во всех файлах Input_file одинаково , он получает максимальное количество строк из всех файлов и печатает совпадающие строки (с номером строки во всех файлах) и печатает строки (которых больше в любом файле, наконец, тоже), если файлы OP имеют это условие .

Допустим, у нас есть 3 файла с именами file1, file2 и file3 следующим образом.

cat Input_file1
1
5
4

cat Input_file2
44
65
56

cat Input_file3
1
2
3
4
5
6

Теперь следующий код.

awk '
prev!=FILENAME{
   count=count>prev_count?count:prev_count
}
{
   prev_count=FNR
}
FNR==1{
   prev=FILENAME
}
FNR==NR{
   a[FNR]=$0
   next
}
{
   a[FNR]=(a[FNR]?a[FNR] ORS:"")$0
}
END{
   count=count>prev_count?count:prev_count
   for(i=1;i<=count;i++){
      print a[i]
   }
}'   Input_file1  Input_file2   Input_file3

Вывод будет следующим.

1
44
1
5
65
2
4
56
3
4
5
6
...