파일에서 한 줄씩 실행하고 각 문장의 마지막 단어를 추출한 다음 내가 만든 다른 스크립트(중간 스크립트라고 함)를 실행하고 이 모든 스크립트를 별도의 줄로 인쇄하는 스크립트를 만들려고 합니다. .
어떤 이유에서인지 무한 루프에 빠졌습니다.
function find_id {
next_file="${*:2}"
temp_file="`echo $next_file | cut -d"." -f1`"
if [[ $temp_file != station ]]; then
while read line; do
if [[ -f "${temp_file}.station" ]]; then
train_col=$((${#line[*]}-1))
$train_id=`echo ${line[${train_col}]}`
echo -n "`intermediate $train_id`"
fi
done < ${temp_file}.station
next_file="`echo $next_file | cut -d"." -f2- | cut -d" " -f2-`"
temp_file="`echo $next_file | cut -d"." -f1`"
echo "`find_id $1 $next_file`"
fi
}
file_list= `ls *.station``
echo "`find_id $1 $file_list``" | sort -n | cut -d" " -f2- | uniq
awk나 sed를 사용할 수 없습니다.
답변1
awk
귀하의 질문에 설명된 대로 수행 중인 활동에 따르면 이러한 모든 항목을 대체하려면 하나만 필요한 것 같습니다 .
awk '$NF' infile*.txt > outfile.txt
$NF
각 줄의 마지막 단어를 나타냅니다 (주변에 공백이 있는 단어를 의미) awk
.
위의 awk
솔루션이 존재하는 동안 배열로 행을 읽고 해당 배열의 마지막 요소를 음수 인덱스(bash 4.3 이상)로 인쇄할 수 있습니다.
arrayedline=( $line )
printf "%s\n", "${arrayedline[@]-1}"
이전 버전에서는 배열 길이의 하위 문자열 1을 사용하는 bash
인덱스의 표현식을 사용할 수 있었고 배열의 마지막 요소를 얻을 수 있었습니다.arrayedline[${#arrayedline[@]-1}]
${#arrayedline[@]}
arrayedline=( $line )
printf "%s\n", "${arrayedline[${#arrayedline[@]}-1]}"
또는 다음과 같이 사용할 수도 있습니다.
printf "%s\n", "${arrayedline[@]:(-1)}" #or
printf "%s\n", "${arrayedlne[@]: -1}"
이제 bash
배열의 인덱싱은 처음부터 이루어집니다 0
.
답변2
다음 중 아무것도 사용하지 않고 이 작업을 수행하는 데 사용할 수 있는 추가 요구 사항은 다음과 같습니다 sed
.
for i in `split -n 1 fn* --filter='cat | rev | cut -f 1 -d 'f' | rev'`; do ./yourscript.sh $i; done
작동 방식에 대한 설명:
split
파일 이름이 로 시작하는 파일을 fn
여러 줄로 나누고 cat | rev | cut -f 1 -d ' ' | rev
각 줄에서 처리합니다.
cat
행을 에코하고 rev
반전시킨 후 cut
로 구분된 단어로 분할 ' '
하고 반전된 문자열의 첫 번째 단어를 출력하고 rev
이를 반전시키면 행의 마지막 단어를 얻습니다.
그런 다음 for...do...done
해당 단어에 대해 스크립트를 실행하십시오.