如何修复输出结果一半的问题

如何修复输出结果一半的问题
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 行范围之外的所有喜欢。tailsed -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在输出中使用制表符作为字段分隔符)。无需通过不同的工具进行管道传输并拥有临时文件,只需提取第三个字段,添加两行并用制表符替换换行符即可。

相关内容