ループの最初の行末に単語リストを追加する

ループの最初の行末に単語リストを追加する

複数のファイル名を含むリストがあります。

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"}'機能しません。最初のファイルと同様に、ファイル名なしで$ 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[@]}"

これはパスに.があるファイルでも機能します=が、残念ながら名前があります-

おすすめ記事