Passando variáveis para o comando sed

3

Temos um arquivo com 6 colunas:

FILEDESCRIPTOR . DESCR00001     FILEDESCRIPTOR  .  DESCRIPTIVENAME
FILEDESCRIPTOR . LSTUPDNAM      FILEDESCRIPTOR  .  LASTUPDATENAME
FILEDESCRIPTOR . LOCAT00001     FILEDESCRIPTOR  .  LOCATION_ID
FILEDESCRIPTOR . RETAILPRC      FILEDESCRIPTOR  .  RETAILPRICE
FILEDESCRIPTOR . LSTUPDTIME     FILEDESCRIPTOR  .  UPDTIMESTAMP
INDUSTRYDIVISION . DESCR00001   INDUSTRYDIVISION  .  DESCRIPTION
INDUSTRYDIVISION . DIVIS00001   INDUSTRYDIVISION  .  DIVISIONCODE
INDUSTRYGROUP . DESCR00001      INDUSTRYGROUP  .  DESCRIPTION
INDUSTRYGROUP . DIVIS00001      INDUSTRYGROUP  .  DIVISION_ID

Tudo o que preciso fazer é tratar as 3 primeiras colunas separadas por um único espaço e armazená-las em uma variável como uma única coluna e, em seguida, armazenar as próximas três separadas por um único espaço em outra variável. Em seguida, use sed para substituir a primeira variável pela segunda.

Eu tentei o script abaixo, mas cometi erros:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]];
do
        column2="$(echo -e "$line \n" | awk '{print $4, $5, $6}')"
        #column3="$(echo -e "$line \n" | awk '{print $3}')"
        column1="$(echo -e "$line \n" | awk '{print $1, $2, $3}' )"
        #echo " $column1"
        #echo " $column2"
                 sed  "s/${column1}/${column2}/g" IMS_Procedures.txt
done < file

O script não está funcionando. Os erros que recebi são:

sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 20: unterminated 's' command
sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 22: unterminated 's' command
sed: -e expression #1, char 22: unterminated 's' command
sed: -e expression #1, char 22: unterminated 's' command
sed: -e expression #1, char 23: unterminated 's' command
sed: -e expression #1, char 30: unterminated 's' command

O que pode ser feito?

    
por Vishal Arukil 09.10.2015 / 16:03

3 respostas

0

Na variável $column1 e $column2 , há uma nova linha no final e o comando sed é exibido assim:

sed  "s/FILEDESCRIPTOR . DESCR00001
  /FILEDESCRIPTOR . DESCRIPTIVENAME
  /g" IMS_Procedures.txt

sed reconhece isso como um comando s não terminado.

Use isso:

while read -r a b c d e f; do
  sed -i "s/$a $b $c/$d $e $f/g" IMS_Procedures.txt
done <file
  • read armazena os 6 campos nas variáveis $a a $f
    • Em seguida, sed substitui os primeiros 3 campos como uma string separada por espaços com os últimos 3 no arquivo IMS_Procedures.txt . -i ativa a edição no local, que as alterações são gravadas no arquivo, em vez de impressas na tela.

Observe que . em sed corresponderá a qualquer caractere e não apenas ao ponto. Isso tem que ser informado com \. na entrada file .

    
por 09.10.2015 / 16:26
3

Não há necessidade de while read ...
Você poderia simplesmente processar seu arquivo de entrada:

sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile

e transforme-o em um script sed :

s/FILEDESCRIPTOR . DESCR00001/FILEDESCRIPTOR . DESCRIPTIVENAME/g
s/FILEDESCRIPTOR . LSTUPDNAM/FILEDESCRIPTOR . LASTUPDATENAME/g
s/FILEDESCRIPTOR . LOCAT00001/FILEDESCRIPTOR . LOCATION_ID/g
s/FILEDESCRIPTOR . RETAILPRC/FILEDESCRIPTOR . RETAILPRICE/g
s/FILEDESCRIPTOR . LSTUPDTIME/FILEDESCRIPTOR . UPDTIMESTAMP/g
s/INDUSTRYDIVISION . DESCR00001/INDUSTRYDIVISION . DESCRIPTION/g
s/INDUSTRYDIVISION . DIVIS00001/INDUSTRYDIVISION . DIVISIONCODE/g
s/INDUSTRYGROUP . DESCR00001/INDUSTRYGROUP . DESCRIPTION/g
s/INDUSTRYGROUP . DIVIS00001/INDUSTRYGROUP . DIVISION_ID/g

e canalizar isso para um segundo sed -f- para processar seu IMS_ Procedures.txt :

sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile | sed -f- IMS_Procedures.txt

Eu não entendo muito bem o que "este é um arquivo e esse comando imprime com espaço único" significa que se os campos em infile forem delimitados por mais de um espaço, você poderá usar tr first:

tr -s '[[:blank:]]' ' ' <infile | sed 's| |/|3;s|.*|s/&/g|' | sed -f- IMS_Procedures.txt
    
por 09.10.2015 / 16:33
0

Eu tentaria o óbvio:

awk '{printf "s/%s%s%s/%s%s%s/\n",$1,$2,$3,$4,$5,$6} ' file |
sed -i -f - IMS_Procedures.txt

onde o arquivo sed é gerado pelo awk.

você pode ajustar o espaço usando

awk '{printf "s/%s %s %s/%s %s %s/\n",$1,$2,$3,$4,$5,$6}
    
por 09.10.2015 / 16:31