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
和组合呢?显然会做同样的工作。或者您可以编写删除除第 2 行到第 3 行范围之外的所有喜欢。tail
sed -n '2p;3p'
sed '2,3!d'
当然,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
在输出中使用制表符作为字段分隔符)。无需通过不同的工具进行管道传输并拥有临时文件,只需提取第三个字段,添加两行并用制表符替换换行符即可。