如何使用 bash 将值从一个单元格拆分到多个单元格

How to split values from one cell to multiple cells using bash

我有一个如下所示的文件:

1|2|3|4
1|2|3|4
1|2|3|4
1   2   3   4
1   2   3   4
1   2   3   4

为了便于理解,我们可以说虽然有些值被划分到不同的单元格中,但还有其他值存储在 单个 单元格中并由制表符分隔(尽管我不太确定)。我想要做的是将这些值拆分到不同的单元格中,这样我的输出文件应该如下所示:

1|2|3|4
1|2|3|4
1|2|3|4
1|2|3|4
1|2|3|4
1|2|3|4

非常感谢您的帮助!

您可以将 sed 与“地址”一起使用:

sed '/|/!s/./|&/g;s/^|//'
  • /|/! 表示“仅 运行 不包含 | 的行上的以下命令”。
  • s/./|&/g| 添加到此类行中的每个字符。
  • s/^|// 从每行的开头删除 |

或者,使用 Perl:

perl -lne '$,="|"; print /\|/ ? $_ : split //'
  • -n 逐行读取输入并 运行 为每个
  • 编写代码
  • l 从输入中删除换行符并将它们添加到 print
  • $, 是通常为空的变量。它指定应该使用什么字符串将参数分隔为 print.
  • condition ? then : else 是三元运算符。如果条件(此处/\|/,即谎言包含|)为真,则打印$_,即该行本身,否则,该行被split成单个字符它们以 $,.
  • 分隔打印

或更简单

perl -pe 's/(?<=.)(?=.)/|/g unless /\|/'
  • -p逐行读取输入,处理后打印每一行
  • (?<=.) 是一个回顾断言,意思是“前面的任何字符”; (?=.) 是一个前瞻断言,意思是“后面有任何字符。
  • 除非该行已经包含|,否则每两个字符之间插入|

注意:您修改了题目,所有答案无效。修复代码留作 reader 的练习。通常问一个新问题会更好。

您也可以使用 tr:

tr -s '[:blank:]' '|'

它将每个字符转换为集合。根据手册页:

  • -s(或--squeeze-repeats):将最后指定的 SET 中列出的重复字符的每个序列替换为单次出现该字符(即用于删除要替换的字符的重复项)
  • [:blank:]:所有水平空格(如果您确定它们都是制表符,请改用 \t