3

我有一个包含 100000 行的文件

1 0110100010010101
2 1000010010111001
3 1000011001111000
10 1011110000111110
123 0001000000100001

我想知道如何通过在字符之间添加空格来有效地显示第二个字段。

0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0
1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0
0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1

一种解决方案是使用 awk 获取第二列,然后使用 sed 添加空格。但由于文件太长,我想避免使用管道。然后我想知道我是否可以通过使用 awk 来做到这一点。

提前致谢

4

5 回答 5

4

这个可以吗?

awk '{gsub(/./,"& ",$2);print $2}' yourFile

例子

kent$  echo "1 0110100010010101
2 1000010010111001
3 1000011001111000"|awk '{gsub(/./,"& ",$2);print $2}'
0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0

更新

第一列中超过 2 位数字不起作用?我没明白:

kent$  echo "133 0110100010010101
233 1000010010111001
333 1000011001111000"|awk '{gsub(/./,"& ",$2);print $2}'
0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 


gsub(/./,"& ", $2)

1 /./  match any single character
2 "& " & here means the matched string, in this case, each character
3 $2   column 2

so it means, replace each character in 2nd column into the character itself + " ".
于 2012-10-05T13:11:00.223 回答
2

一种仅使用的方法awk

awk '{ gsub( /./, "& ", $2 ); print $2; }' infile

这会产生:

0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0

编辑肯特和我给出了相同的实现,所以,为了让这个答案更有用,我将添加sed一个:

sed -e 's/^[^ ]* *//; s/./& /g' infile
于 2012-10-05T13:10:30.350 回答
2

只需添加一个 sed 替代方案:

sed -e 's/^.* *//;s/./& /g;s/ $//' file

三个命令:

  1. 删除行首的字符和空格
  2. 用它自己替换每个字符,后跟一个空格
  3. (可选)删除行尾的尾随空格
于 2012-10-05T13:16:58.177 回答
1

sed解决方案。

sed 's/.* //;s/\(.\)/\1 /g'

它在每行的末尾添加了一个额外的空格。添加;s/ $//到表达式以将其删除。

于 2012-10-05T13:16:29.317 回答
0

这可能对您有用(GNU sed):

sed 's/^\S*\s*//;s/\B/ /g' /file
于 2012-10-06T07:47:03.960 回答