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
使用這種笨拙且難以閱讀的head
and組合呢?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
在輸出中使用製表符作為字段分隔符號的選項)。無需透過不同的工具進行管道傳輸並擁有臨時文件,只需提取第三個字段,再追加兩行並用製表符替換換行符即可。