如何将管道分隔数据转换为垂直格式数据

如何将管道分隔数据转换为垂直格式数据

我有一个场景希望数据以垂直格式存储在文件中

下面是数据

143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28

应用我的以下逻辑后,我的数据采用以下格式

cat demo.txt |rev| cut -d'|' -f3-|rev|cut -d'|' -f2-

它给了我所需的输出,如下所示

2345|3456|4567|2345|3457

但现在的问题是我想要将所需的垂直格式输出数据保存到文本文件中

就像下面的文件中一样

2345
3456
4567
2345
3457

答案1

tr '|' '\n'

会将每个管道转换为换行符并且应该可以解决问题。

echo "143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28" | tr '|' '\n'

或者也许在你的情况下你正在寻找

cat file | tr '|' '\n' > newfile

答案2

为了处理多行和可变数量的字段,这会删除 col1 和最后两列,并垂直放置剩余的列。

awk '-F|' '{ for (f = 2; f <= NF - 2; ++f) print $(f); }' data.txt

答案3

使用您的原始数据和 GNU head

$ tr '|' '\n' <demo.txt | head -n -2
143
2345
3456
4567
2345
3457

tr命令只是将|- 字符更改为换行符。请注意,tr仅从标准输入读取,因此您需要重定向到它。

如果head给 GNU 的行数为负数,它会从数据末尾删除该行数。

或者,通过一次调用sed

$ sed 's/\(|[^|]*\)\{2\}$//; y/|/\n/' demo.txt
143
2345
3456
4567
2345
3457

在这里,替换将|通过匹配两个|- 字符和每个字符后面的字符串来删除最后两个 - 分隔字段,然后该y命令将剩余的每个字段更改|为换行符(就像tr第一个解决方案中的那样)。

使用sed -E,它可能更具可读性(请注意,我们|现在必须转义其中一个 - 字符):

sed -E 's/(\|[^|]*){2}$//; y/|/\n/' demo.txt

相关内容