CAR 38 DOG 42 CAT 89 CAR 23 APE 18
如果第1列有一个string,第2列不(或它实际上是一个emptrystring)。 反之亦然:如果列1是空的,列2有一个string。 换句话说,“对象”(CAR,CAT,DOG等)出现在列1或列2中,但从来都不是。
我正在寻找一种有效的方法来整合第1列和第2列,以便文件看起来像这样:
CAR 38 DOG 42 CAT 89 CAR 23 APE 18
我可以通过使用while和if来在Bash脚本中做到这一点,但我确信有一个更简单的方法。 有人可以帮忙吗?
如何从命令行find两个文件的Set – Subset?
linux +在文件目录下findword,但很快
xargs和发现,rm抱怨文件名中的 n(换行符)
为scp linux命令创build快捷命令
干杯! ž
shell命令parsingxml的行为不正确
如何从文件linuxfind独特的单词
使用bash模拟按键
获取脚本的ntpdate结果
尝试这个:
column -t file
输出:
汽车38
狗42
CAT 89
CAR 23
APE 18
注意:如果:
您正在寻找具有自动调整大小的左对齐固定宽度列的输出(最长的字段值决定了宽度,较短的值使用右对齐的空格)
并且很高兴有两个空格作为列分隔符
使用赛勒斯更简单的,以列为基础的答案 。
在性能和资源消耗方面,请参见下面的基于column的方法与基于awk的方法的比较。
awk是你的朋友在这里:
awk -v OFS=' ' '{ print $1,$2 }' file
awk默认将行分割为空白字段,所以,在你的输入中, CAR 38和DOG 42被解析( CAR和DOG变成字段1, $1 38和42变成字段2, $2 )。
-v OFS=' '将输出字段分隔符设置为两个空格(默认为单个空格); 请注意,不会有填充的输出值来创建对齐的输出。
要创建具有不同宽度字段的对齐输出,请使用Awk的printf函数,这样可以更好地控制输出; 例如以下输出一个10个字符的左对齐的第一列和一个2个字符的右对齐的第二个列:
awk '{ printf "%-10s %2sn",$1,$2 }' file
请注意,列宽必须事先知道。
相比之下, column -t方便地通过首先解析所有数据来自动确定列宽,但是具有性能和资源消耗的影响; 见下文。
column -t需要首先分析所有输入数据,以便能够确定最大输入列宽; 从我所知道的情况来看,首先将输入作为一个整体读入到内存中,这对于大型输入文件来说可能是有问题的。
相比之下,Awk解决方案逐一读取行 – 但依赖提前知道列宽。
从而,
column -t将消耗与输入大小成正比的内存 ,而awk将使用恒定的内存量 。
column -t 通常比较慢 ,取决于所使用的Awk实现; mawk要快得多, gawk要快一点,BSD awk比较慢(!); 基于1000万行输入文件的结果; 命令在OSX 10.10.2和Ubuntu 14.04上运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。