如何解決一半輸出結果的問題

如何解決一半輸出結果的問題
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 行?

例如:

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

您解決了任務,但留下了一個問題,如果沒有所需信息,任何人都無法回答。該網站作為其他人尋找問題答案的存檔,因此留下這樣的懸而未決的問題很煩人。

我藉此機會展現你的嘗試的弱點。例如,您混合使用工具沒有優勢:

sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
head -3 "$f" | tail -2 >> displayStudentInfo.txt

第一行表明您知道如何使用來獲取某些行,那麼為什麼您在第二行中sed使用這種笨拙且難以閱讀的headand組合呢?tail顯然sed -n '2p;3p'會做同樣的工作。或者您可以寫入sed '2,3!d'刪除第 2 行到第 3 行範圍之外的所有讚。

當然,sed也可以提取第一行的第三個字段sed -E '1!d;s/([^ ]* ){2}//;s/ .*//'(刪除前兩個字段,然後刪除第一個字段後面的所有內容),這在這一點上還沒有簡化,但如果你想組合所有三個部分,會更容易到一行,甚至擺脫循環for

sed -sE '1!d;s/([^ ]* ){2}//;s/ .*//;N;N;s/\n/\t/g' 20*.txt

(GNUsed語法帶有-s單獨處理文件的選項以及\t在輸出中使用製表符作為字段分隔符號的選項)。無需透過不同的工具進行管道傳輸並擁有臨時文件,只需提取第三個字段,再追加兩行並用製表符替換換行符即可。

相關內容