duplique um arquivo várias vezes e adicione linhas diferentes em cada arquivo

2

Eu sei como duplicar um arquivo várias vezes usando os comandos bash , mas agora eu quero saber como escrever em cada um desses arquivos duplicados uma saída diferente. Então, por exemplo:

Eu tenho 1 arquivo com 5 linhas e cada linha contém diferentes anotações como:

1    16451824   16451824
2    17322876   17322876
3    17354363   17354363
4    17355234   17355234
5    17371253   17371253

E eu tenho outro arquivo que eu dupliquei 5 vezes.

Agora quero escrever em cada um desses arquivos uma linha do meu primeiro arquivo, para que todos tenham uma anotação exclusiva.

Qual é a maneira mais fácil de fazer isso usando bash ?

Editar

Então, meu "Outro arquivo", que é duplicado 5 vezes, é assim:

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907

E eu gostaria de uma saída como:

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
1 16451824  16451824  <-- first line from first file

Próximo arquivo ...

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
2 17322876  17322876 <-- second line from my first file

etc.

Espero que isso seja um pouco mais claro

    
por Osman Altun 21.12.2017 / 10:04

4 respostas

4

Com o GNU coreutils :

split -l1 file --filter='cat another - > "$FILE"'

Os arquivos de saída são nomeados xaa , xab etc. por padrão:

$ head xa?
==> xaa <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
1    16451824   16451824

==> xab <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
2    17322876   17322876

==> xac <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
3    17354363   17354363

==> xad <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
4    17355234   17355234

==> xae <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
5    17371253   17371253
    
por 21.12.2017 / 11:38
3

Awk solução:

awk -v f2="$(cat file2)" '{ print f2 ORS $0 > "file"++c".txt" }' file1
  • file1 e file2 - são seus arquivos "primeiro" e "outro" respectivamente
  • f2 - variável contendo o conteúdo do file2

Visualizando resultados:

$ head file[0-9]*.txt
==> file1.txt <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
1 16451824  16451824

==> file2.txt <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
2 17322876  17322876

==> file3.txt <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
3 17354363  17354363

==> file4.txt <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
4 17355234  17355234

==> file5.txt <==
1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
5 17371253  17371253
    
por 21.12.2017 / 11:20
2

Eu peguei este script, não o melhor, mas funciona:

#!/usr/bin/env bash

# Create an array of the lines in file f1
# create a counter
count=0
#declare an array
declare -a m

while IFS=$'\n' read -r data
do
    # Add each line to the m array
    m["$count"]="$data"
    # increase the count
    count=$((count+1))

done < "$1"    

# Declare another array to hold the duplicate files
# locations
declare -a c
c=(/path/to/duplicate/files/folder/*)
# Create another counter
f=0

for ((i=0; i<"${#c[@]}"; i++))
do
        # inject lines into the duplicate files
        echo "${m[$f]}" >> "${c[$i]}"
        f=$((f+1))
done

f1:

1    16451824   16451824
2    17322876   17322876
3    17354363   17354363
4    17355234   17355234
5    17371253   17371253

Resultados:

f2

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
1    16451824   16451824

f3

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
2    17322876   17322876

f4

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
3    17354363   17354363

f5

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
4    17355234   17355234

f6

1 40780020  40780020
2 41223003  41223003
3 43218205  43218205
4 43395462  43395462
5 43803907  43803907
5    17371253   17371253
    
por 21.12.2017 / 13:49
1

Tenho certeza de que alguém criará uma única linha capaz de fazer isso, mas aqui está um script sh simples.

#!/bin/sh
# This script assumes the files that will have the line
# added are named f1.txt f2.txt f3.txt f4.txt f5.txt
#
# The data file contains the 5 lines that will be 
# copied to the 5 files.

# The "per line" data file
DATA='cat f0.txt'

# The number of files that need to have a line added
F_LIST="1 2 3 4 5"

# NOTE: No error checking!!!
IFS="
"
for l in $DATA
do
    f=${F_LIST%% *}
    echo "$l" >> "f${f}.txt"
    F_LIST=${F_LIST#* }
done
exit
    
por 21.12.2017 / 11:21