6つの列を持つファイルがあります。
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
私がしなければならないのは、最初の3つの列を単一のスペースで区切って処理して単一の列として変数に保存し、次に3つの列を単一のスペースで区切って別の変数に保存することです。次に、sed
最初の変数を2番目の変数に置き換えます。
以下のスクリプトを試しましたが、エラーが発生しました。
#!/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
スクリプトが機能しません。私が得るエラーは次のとおりです。
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
何ができますか?
答え1
必要ありませんwhile read
。
単に入力ファイルを処理できます。
sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile
これを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
sed -f-
IMS_を処理するために2番目の項目に渡しますProcedures.txt
。
sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile | sed -f- IMS_Procedures.txt
「これはファイルであり、このコマンドは単一のスペースで印刷します」という意味を理解していません。したがって、フィールドがinfile
複数のスペースで区切られている場合は、tr
まず次のものを使用できます。
tr -s '[[:blank:]]' ' ' <infile | sed 's| |/|3;s|.*|s/&/g|' | sed -f- IMS_Procedures.txt
答え2
$column1
と変数の$column2
末尾に改行がある場合、sed
コマンドは次のようになります。
sed "s/FILEDESCRIPTOR . DESCR00001
/FILEDESCRIPTOR . DESCRIPTIVENAME
/g" IMS_Procedures.txt
sed
これを終了していないsコマンドとして認識します。
代わりにこれを使用してください:
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
$a
変数に6つのフィールドを保存$f
- 次に、
sed
スペースで区切られた文字列である最初の3つのフィールドをファイルの最後の3つのフィールドに置き換えますIMS_Procedures.txt
。-i
変更を画面に印刷するのではなくファイルに書き込むには、内部編集を有効にします。
- 次に、
.
inはドットだけsed
でなく、すべての文字と一致します。\.
inputからエスケープする必要がありますfile
。
答え3
私は明らかな事を試みる:
awk '{printf "s/%s%s%s/%s%s%s/\n",$1,$2,$3,$4,$5,$6} ' file |
sed -i -f - IMS_Procedures.txt
sed ファイルは awk によって生成されます。
調整スペースが利用可能
awk '{printf "s/%s %s %s/%s %s %s/\n",$1,$2,$3,$4,$5,$6}