for f in 20*.txt
do
sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
head -3 "$f" | tail -2 >> displayStudentInfo.txt
done
cat displayStudentInfo.txt
rm displayStudentInfo.txt
printf "\n"
このコードを使用すると、ファイル内の半分しか表示されませんが、試してみるとcat
結果を完全に表示できます。また、最初の 3 行ではなく、すべてのファイルを 1 行にリストするにはどうすればよいでしょうか。
例えば:
ID
Name
Grade
代わりにすべてを一列に並べたいと思います:
ID Name Grade
このコードを使用すると、head displayStudentInfo.txt
ファイル内の半分の内容が返されます。
201700128
GPA: 3.2
Major: Pharmacy
201703451
GPA: 2.2
Major: Political Science
201759284
GPA: 3.4
Major: Marketing
201800082
学生は 9 人いるはずですが、ID、専攻、GPA を 1 行に入力する方法がわかりません。
答え1
課題は解決しましたが、必要な情報がなければ誰も答えられない質問が未解決のままになっています。このサイトは、問題の答えを探している他のユーザーのためのアーカイブとして機能しているため、このような未解決の質問を残すのは迷惑です。
私はあなたの試みの弱点を実証する機会を得ました。例えば、あなたは利点のないツールを組み合わせています。
sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
head -3 "$f" | tail -2 >> displayStudentInfo.txt
最初の行は、特定の行を取得するために を使用する方法を知っていることを示しています。では、なぜ2 行目で、sed
扱いにくく読みにくい と の組み合わせを使用するのでしょうかhead
。明らかに、 でも同じ結果が得られます。または、 2 行目から 3 行目の範囲を除くすべてのいいねを削除するように記述することもできます。tail
sed -n '2p;3p'
sed '2,3!d'
もちろん、sed
最初の行の 3 番目のフィールドを次のように抽出することもできますsed -E '1!d;s/([^ ]* ){2}//;s/ .*//'
(最初の 2 つのフィールドを削除し、最初のフィールドの後ろにあるすべてのものを削除します)。この時点では簡略化は行われませんが、3 つの部分すべてを 1 行に結合してループを削除したい場合は簡単になりますfor
。
sed -sE '1!d;s/([^ ]* ){2}//;s/ .*//;N;N;s/\n/\t/g' 20*.txt
(ファイルを個別に処理し、出力でタブをフィールド区切り文字として使用するオプションを備えたGNUsed
構文)。さまざまなツールをパイプして一時ファイルを作成する必要はなく、3 番目のフィールドを抽出し、さらに 2 行追加して、改行をタブに置き換えるだけです。-s
\t