여러 파일의 줄을 반복합니다(bash).

여러 파일의 줄을 반복합니다(bash).

파일에서 한 줄씩 실행하고 각 문장의 마지막 단어를 추출한 다음 내가 만든 다른 스크립트(중간 스크립트라고 함)를 실행하고 이 모든 스크립트를 별도의 줄로 인쇄하는 스크립트를 만들려고 합니다. .

어떤 이유에서인지 무한 루프에 빠졌습니다.

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해당 단어에 대해 스크립트를 실행하십시오.

관련 정보