ファイルを行ごとに分割し、最初のフィールドを削除して、結果のフラグメントの名前として使用します。

ファイルを行ごとに分割し、最初のフィールドを削除して、結果のフラグメントの名前として使用します。

次のテキストファイルがあります。

19-198-0000 NORTHANGER ABBEY
19-198-0001 THIS LITTLE WORK WAS FINISHED IN THE YEAR EIGHTEEN O THREE AND INTENDED FOR IMMEDIATE PUBLICATION IT WAS DISPOSED OF TO A BOOKSELLER IT WAS EVEN ADVERTISED
19-198-0002 NEITHER THE AUTHOR NOR THE PUBLIC HAVE ANY OTHER CONCERN THAN AS SOME OBSERVATION IS NECESSARY UPON THOSE PARTS OF THE WORK WHICH THIRTEEN YEARS HAVE MADE COMPARATIVELY OBSOLETE
19-198-0003 THE PUBLIC ARE ENTREATED TO BEAR IN MIND THAT THIRTEEN YEARS HAVE

など。私が望むのは、初期ファイルと同じ行数で小さなテキストファイルを作成する方法です。名前は行の先頭の数字で、内容は残りです。

たとえば、上記の小さな部分から:

19-198-0000.txt  would contain: NORTHANGER ABBEY
19-198-0001.txt  would contain: THIS LITTLE WORK WAS FINISHED IN THE YEAR EIGHTEEN O THREE AND INTENDED FOR IMMEDIATE PUBLICATION IT WAS DISPOSED OF TO A BOOKSELLER IT WAS EVEN ADVERTISED
19-198-0002.txt  would contain: NEITHER THE AUTHOR NOR THE PUBLIC HAVE ANY OTHER CONCERN THAN AS SOME OBSERVATION IS NECESSARY UPON THOSE PARTS OF THE WORK WHICH THIRTEEN YEARS HAVE MADE COMPARATIVELY OBSOLETE
19-198-0003.txt  would contain: THE PUBLIC ARE ENTREATED TO BEAR IN MIND THAT THIRTEEN YEARS HAVE

など。

答え1

while read -r tag line; do
    printf '%s\n' "$line" >"$tag".txt
done <text.in

2 つの変数読み取りを使用すると、read最初の単語が最初の変数に配置され、残りの行が 2 番目の変数に配置されます。

「単語」の構成は の値によって異なります$IFS。デフォルトでは、read行はスペース、タブ、または改行に基づいて単語に分割されます。

ループで使用すると、行の先頭から名前を取得するファイルに行(最初の単語または「タグ」を除く)が出力されます。

答え2

bashまったく必要ありません。

awk '{file = $1".txt"; $1=""; print substr($0,2) > file; close(file)}' a_text_file
  • file最初の列から取得し、.txtその後にaを追加します。
  • 最初の列を削除します。
  • 残りの列(他の先行スペースを除く)をに印刷しますfile

一方、対応するwhileループについては次のようになりますbash

$ (echo first; echo -n second) | while read line; do echo $line; done
first
$ 

まあ、自動データ損失です。あることを確認することをお勧めしますいつも最後の改行文字ですか?

答え3

これを行いました。

#!/bin/bash

while read -r filename content ; do
    printf '%s\n' "$content" >> "${filename}.txt"
done < some_file.txt

関連情報