awk 변수에서 문자열 제거

awk 변수에서 문자열 제거

HP-UX *** B.11.31 U ia64 *** 무제한 사용자 라이센스

현재 디렉터리에 있는 abc.txt라는 파일을 ./begperl이라는 디렉터리로 이동하고 싶습니다. 이 작업을 수행할 때 파일의 모바일 버전 이름을 ab.txt로 지정하고 싶습니다. 내가 원하는 것은 파일 이름에서 미리 정의된 문자열을 제거하고 이를 이동한 다음 세 번째 변수 = Y/를 기반으로 원본 파일 N을 제거하는 것입니다. 나는 성공하지 못한 채 아래 oneliners를 시도했습니다.

awk -v name=abc.txt -v dir=begperl 'BEGIN{ renamed_var=substr("c", "", name);system("mv " name  "./"dir/renamed_var)}' 

awk -v name=abc.txt -v dir=begperl 'BEGIN{ renamed_var=substr("c", "", name); print renamed_var}'

awk -v name=abc.txt -v dir=begperl 'BEGIN{ print substr("c", "", name) }'


awk -v name=abc.txt -v dir=begperl -v variable_two=substr("c", "", name){print variable_two}' 


awk -v name=abc.txt -v dir=begperl -v variable_two=substr("c", "", name){print variable_two}'

내가 가지고 있는 유일하게 작동하는 라이너는

awk -v name=abc.txt -v dir=begperl 'BEGIN{ system("mv " name " ./"dir)}' 

매우 감사합니다

답변1

당신은 sub(하위대학원) 대신 substr(하위) 명령: 비교

$ awk -v name="abc.txt" 'BEGIN {substr("c","",name) ; print name}'
abc.txt

그리고

$ awk -v name="abc.txt" 'BEGIN {sub("c","",name) ; print name}'
ab.txt

그러나 프로그래밍 학습 연습으로 이 작업을 수행하지 않는 한 awk쉘을 사용하여 다음과 같은 작업을 수행하지 않을 이유가 없습니다 bash.

newname="${name%c.*}.${name##*.}"

name가장 짧은 후행 일치 항목으로 시작 c.하고 가장 긴 일치 부분을 제거하여 형성된 점 확장과 연결되는 문자열을 형성합니다..

답변2

왜 이것을 사용합니까 awk? 원래 이름과 대상 이름이 모두 있으면 그냥 사용하면 되지 않나요 mv abc.txt begperl/ab.txt?

대상 이름이 없고 원래 이름에서 한 문자만 제거하려는 경우 셸에서 이 작업을 수행할 수 있습니다. 다시 말하지만, 다음을 수행할 필요가 없습니다 awk.

file="abc.txt"; mv "$file" begperl/"${file//c}"

그러면 c에서 의 모든 항목이 제거됩니다 $file. 첫 번째 항목만 삭제하려면 다음을 사용하세요.

file="abc.txt"; mv "$file" begperl/"${file/c}"

또는 다음을 수행할 수 있습니다.

mv abc.txt begperl/"$(echo "abc.txt" | sed 's/c//')"

답변3

저는 OP입니다. 생각보다 하나의 라이너로 구현하기가 쉽지 않은 것 같습니다. 나는 이 라이너를 나중에 만들 것이라고 생각합니다(아니면 절대 만들지 않을 것입니다 ;-))

#!/usr/bin/ksh
ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE=$1
REMOVE_STRING_VARIABLE=$2
DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE=$3
if [[ $# -ne 3 ]]
then
echo "Script requires three parameters. First:Filename with path. Second:String to remove from filename. Third:Y or N to delete file"
exit 1
fi
ORIGINAL_FILE_NAME_VARIABLE=`echo  ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} | awk -F '/' '{print $NF}'`
#echo ${ORIGINAL_FILE_NAME_VARIABLE}
AMENDED_FILE_NAME_VARIABLE=`echo ${ORIGINAL_FILE_NAME_VARIABLE} | sed "s/${REMOVE_STRING_VARIABLE}//g"`
#echo ${AMENDED_FILE_NAME_VARIABLE}
ORIGINAL_FILE_LOCATION_DIR=`echo ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} | awk 'BEGIN{FS=OFS="/"}{$NF=""; NF--; print}'`
if [[ -f ${ORIGINAL_FILE_LOCATION_DIR}/${AMENDED_FILE_NAME_VARIABLE} ]]
then
AMENDED_FILE_NAME_VARIABLE=${AMENDED_FILE_NAME_VARIABLE}_$$_$$
fi
echo ${ORIGINAL_FILE_NAME_VARIABLE}|grep -q ${REMOVE_STRING_VARIABLE}
if [[ $? -ne 1 ]] 
then
cp ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} ${ORIGINAL_FILE_LOCATION_DIR}/${AMENDED_FILE_NAME_VARIABLE}
if [[ ${DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} = 'y' || ${DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} = 'Y' ]]
then
rm ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE}
fi
fi

하지만 저는 이것이 한 줄로 가능하다고 생각합니다. 저는 OP입니다. 논평?

관련 정보