ファイル名を列ヘッダーとして追加

ファイル名を列ヘッダーとして追加

txt形式のテーブルを含むディレクトリがあり、ファイル名を2番目の列のヘッダーとして追加したいと思います。たとえば、次のようになります。

File_1.txt

row_1 1 
row_2 0 
row_3 1  
row_4 1 
row_5 1 
row_6 1

出力.txt

rows  file_1
row_1  1 
row_2  0 
row_3  1  
row_4  1 
row_5  1

私はこのようなことを考えていました。

sed 1 's/top_row/$file_name/1' < "$file";

答え1

これは1行を作成し、ファイル全体を出力しますrows file_1.txt

 echo "rows $file"; cat "$file"

上記のように出力からファイル拡張子を削除するには、次のようにしますbasename

 echo "rows $(basename $file .txt)"; cat "$file"

答え2

for file in ./file_*.txt
do
  awk 'NR==1 { print "rows", FILENAME }; 1' "$file" > temp && mv temp "$file"
done

-iまたは、内部編集をサポートするsedを使用してください。

for file in ./file_*.txt
do
  sed -i "1i\
rows $file" "$file"
done

答え3

file_*.txt処理したいすべてのファイルと一致し、ファイルがタブを区切り文字として使用しているとします。

tmpfile=$(mktemp)
for filename in file_*.txt; do
    { printf 'rows\t%s\n' "$filename"; cat "$filename"; } >$tmpfile &&
    mv "$tmpfile" "$filename"
done

これは一致するファイル名を繰り返し、ファイルごとにヘッダーとファイル自体の内容を含む行を一時ファイルに出力し、すべてが正しく進むと元のファイルを置き換えます。

これにより元のファイルが変更されます。あなたの質問では、例を提供し、これを出力する必要があると述べましたが、output.txt結果を他のすべてのファイルに書き込む場所が明確ではなかったため、このアプローチを使用しました。

答え4

ただ楽しみのための理解できないパール

perl -i -pe '$.==1&&do{($f=$ARGV)=~s/\..*?$//;$_="rows $f\n$_"};close ARGV if eof' *.txt

関連情報