如何使用 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
)
我有一个如下所示的文件:
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
)