루프의 첫 번째 줄 끝에 단어 목록 추가

루프의 첫 번째 줄 끝에 단어 목록 추가

여러 파일 이름이 포함된 목록이 있습니다.

file1
file2

다음과 같이 각 파일의 첫 번째 줄 끝에 파일 이름을 추가하고 싶습니다.

파일 1의 첫 번째 줄은 다음과 같습니다.

> ATCGCCfile1

파일 2의 첫 번째 줄은 다음과 같습니다.

> ATTTCCfile2

내 현재 아이디어는 파일 이름으로 변수 a를 만드는 것입니다.

a="file1 file2"

파일을 반복하고 색인을 불러오는 단어를 추가합니다.

for i in $a; do cat $i | awk '{print $0"$i"}' > $i.extended_word.txt; done

그러나 출력에서는 awk '{print $0"$i"}'작동하지 않습니다. 첫 번째 file 의 경우처럼 파일 이름 없이 $i만 제공됩니다 >ATCGCC$i.

내가 뭘 잘못했나요? 나는 또한 awk '{print $0"${i}"}'성공하지 못한 채 괄호( )를 시도했습니다.

답변1

목록을 저장하려면 배열이 필요합니다.

a=(
  file1
  file2
  'other file with spaces'
  $'even with\nnewlines'
)
awk -- '
  FNR == 1 {
    close(out)
    $0 = $0 FILENAME
    out = FILENAME".extended_word.txt"
  }
  {print > out}' "${a[@]}"

파일 이름에 문자가 포함된 경우 나머지가 유효한 변수가 아닌지 =확인해야 합니다 . 예를 들어 파일이 있으면 .=awkfile=1./file=1

GNU의 경우 awk해결 방법은 다음과 같이 작성하는 것입니다.

gawk -e '
  FNR == 1 {$0 = $0 FILENAME}
  {print > FILENAME ".extended_word.txt"}
  ' -E /dev/null "${a[@]}"

이는 경로에 .이 있는 파일에도 작동 =하지만 불행히도 이름이 -.

답변2

모든 파일이 동일한 디렉토리에 있고 목록이 하나의 파일에 있다고 가정합니다.

파일.txt

file1
file2

사용 mapfilesed:

mapfile -t files < files.txt

for f in "${files[@]}"; do
  if [ ! -f "$f" ]; then
    echo "File '$f' does not exists."
    continue
  fi
  
  sed "1s;.*;&$f;" "$f"
  
  # With option '-i' the file will be written
  # sed -i "1s;.*;&$f;" "$f"
done

관련 정보