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
첫 번째 변수를 두 번째 변수로 바꿉니다.
아래 스크립트를 시도했지만 오류가 발생했습니다.
#!/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_를 처리하기 위해 두 번째 항목에 전달합니다 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}