Bash 如何在文件中特定字段中的单词字符之间插入空格

Bash 如何在文件中特定字段中的单词字符之间插入空格,bash,awk,processing-efficiency,Bash,Awk,Processing Efficiency,我有一个包含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

我有一个包含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来做到这一点


提前感谢

单向使用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

EDITKent我给出了相同的实现,因此,为了让这个答案更有用,我将添加
sed
一个:

sed -e 's/^[^ ]* *//; s/./& /g' infile
这样行吗

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
更新

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
第1列中超过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 + " ".

sed
解决方案

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

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

只需添加一个sed替代项:

sed -e 's/^.* *//;s/./& /g;s/ $//' file
三个命令:

  • 删除行首的字符和空格
  • 将每个字符替换为后跟空格的自身字符
  • (可选)删除行末尾的尾随空格
  • 这可能适用于您(GNU-sed):


    谢谢你的回答。但是我忘了提到第一列包含两位数以上的值。那么我认为它不起作用了。你能解释一下gsub(/。/,“&”,$2)中使用的正则表达式的含义吗