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