⭐️ LeetCode解题系列 ⭐️ 194. 转置文件(Shell)

举报
Lucifer三思而后行 发表于 2021/08/06 18:05:25 2021/08/06
【摘要】 ⭐️ LeetCode解题系列 ⭐️ 194. 转置文件(Shell)

❤️ 原题 ❤️

给定一个文件 file.txt,转置它的内容。

你可以假设每行列数相同,并且每个字段由 ' ' 分隔。

示例:

假设 file.txt 文件内容如下:

name age
alice 21
ryan 30

应当输出:

name alice ryan
age 21 30

☀️ 解题思路 ☀️

分析

文件内容为2行3列,每行列数相同,字段由 ' ' 分隔,需要将第一列转为第一行,第二列转为第二行。

xargs 多行变单行

很容易就想到了 xargs 这个命令,可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

举例:

cat <<EOF>1.txt
1
2
3
EOF
cat 1.txt | xargs

在这里插入图片描述
但是有个问题,如果有多列的情况下,输出只能按次序只能变成单行。也就是如下:
在这里插入图片描述
无法达到需要的效果。所以得想办法依次取到每一列然后执行 xargs 输出。如何取到第一列的数据呢?

awk + print 打印列

可以使用 awk 命令处理文本,配置 print 命令来获取指定列的数据:

awk '{print $1}' 1.txt

在这里插入图片描述
这样就达到了我们的要求,接下来只需要获取文本有多少列,然后循环输出即可。

head + wc 获取列数

通过 head -n 命令可以获取文件指定行数的内容,再使用 wc -w 即可获取当前行的所有列数。由于本题每行列数相同,因此我们取第一行即可。

cat 1.txt | head -n 1 | wc -w

在这里插入图片描述
获取每行的总列数为2列。接下来再写个循环来输出:

columns=$(cat 1.txt | head -n 1 | wc -w)
for i in $(seq 1 $columns)
do
awk '{print $'''$i'''}' 1.txt | xargs
done

在这里插入图片描述
至此,已经成功解题,达到了所需结果。将文中的 1.txt 换成 file.txt,去 LeetCode 执行一下看看结果吧:
在这里插入图片描述

❄️ 写在最后 ❄️

本题主要用到一些 Linux 基础命令:awkheadxargswcprint,需要熟练掌握使用。


本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。