我有一个场景希望数据以垂直格式存储在文件中
下面是数据
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