出力結果が半分になる問題を修正する方法

出力結果が半分になる問題を修正する方法
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 行目の範囲を除くすべてのいいねを削除するように記述することもできます。tailsed -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

関連情報