次の順序で詳細を含むファイルがあります。
Name1
School Name1
State1
Name2
School Name2
State2
Name3
School Name3
State3
3回繰り返したい(例ファイルには3つのグループが含まれていますが、ここで論理を考えました(sic)nグループがある場合、ループはnグループを実行する必要があります)。最初のループでは、最初の行から始める必要がありますファイルを3行まで読んでから、次のループで4行から6行、そして7行から9行までの同じセット(名前、学校名、週)に多くの項目があります場合は読み続けます。繰り返しごとに、ファイルの入力を別の標準出力ファイルに供給します。ファイルから入力を受け取り、他のファイルに供給するジョブスクリプトがありますが、コレクションが重複している場合はロジックが機能するようにすることは困難です。
答え1
一度に3行ずつファイルを読み取るには、次のようにします。
while
IFS= read -r name
IFS= read -r school
IFS= read -r state
do
echo "$name:$school:$state"
done < input.file > output.file
whileループの「条件」として多くのコマンドを使用できるという事実を活用してください。
答え2
awk
まったく同じ出力の使用とコピーGlenn Jackmanは彼の答えでした。:
$ awk -v OFS=':' '{ name=$0; getline sname; getline state;
print name,sname,state }' <input.file >output.file
-v OFS=':'
(「出力フィールド区切り文字」)をOFS
コロンに設定します。getline
の関数はawk
(指定された変数で)次の行を読み取り、指定されprint
たフィールドで区切られたレコードを印刷しますOFS
。
答え3
GNUの使用sed
:
sed '1~3{N;N;s/\n/:/g}' < input.file > output.file
仕組み:
1~3 # match every 3rd line, starting with the 1st
{
N;N; # append the next 2 lines of input into the pattern space
s/\n/:/g # replace newlines with your chosen separator
}
答え4
使用xargs
、
xargs -d'\n' -n3 < file somecommand
3つの改行で区切られた値を取得し、引数としてfile
渡します。somecommand
前任者。使用printf
:
$ xargs -d'\n' -n3 < file printf '"%s","%s","%s"\n'
"Name1","School Name1","State1"
"Name2","School Name2","State2"
"Name3","School Name3","State3"