有条件地将列分成两行?

有条件地将列分成两行?

我有一个格式为以下的文件:

 ⌚..⌛    watch..hourglass
 ⌨️       keyboard
 ⏏️       eject button

其中某些行包含两个条目。我想将包含 2 个条目的行分成 2 行,如下所示:

 ⌚       watch
 ⌛       hourglass
 ⌨️       keyboard
 ⏏️       eject button

有没有快速的方法来做到这一点?


我的脚本:

#!/usr/bin/env bash

wget -O output.txt http://www.unicode.org/Public/emoji/6.0/emoji-data.txt

sed -i '/^#/ d' output.txt                        # Remove comments                                                                                                          
sed -i 's/.*(//' output.txt                       # Remove columns not needed                                                                                               
sed -i 's|[(),]||g' output.txt                    # Remove brackets around emoji                                                                                         
sed -i 's/\(.*[^ ]\)[ ]*\(.*\)/\2 \1/' output.txt # Move first column to last                                                                         
sed -i '/^$/d' output.txt                         # Remove blank lines

尝试了 @RomanPerekhrest 对以下问题的回答(答案已更新)

 ↔️..↙️    left-right arrow..down-left arrow
 ↩️..↪️    right arrow curving left..left arrow curving right
 ⌚..⌛    watch..hourglass done
 ⌨️       keyboard

它适用于手表/沙漏,但不适用于上面的手表/沙漏(?)

答案1

更新

修复了一些表情符号后面跟着的问题变化选择器 16,导致格式错误。

请参阅@jimmij 的回答,以获得更优化的 sed 脚本!

sed

 sed '/.\.\./ s/\(.\)\.\.\(\S*\)\s*\(.*\)\.\./\1\t\3\n \2\t/'

答案2

另一个sed版本,基于 zeppelin 答案,但更简单且对齐 - 注意 unicode 并不总是单字符。使用 gnu 进行测试sed

sed 's/\.\.\([^ ]*\) *\(.*\)\.\./\t\2\n \1\t/'

输出:

 ↔️      left-right arrow
 ↙️      down-left arrow
 ↩️      right arrow curving left
 ↪️      left arrow curving right
 ⌚      watch
 ⌛      hourglass done
 ⌨️       keyboard

答案3

awk解决方案:

awk -F'[[:space:]][[:space:]]+' '$1~/\S\.\.\S/ && $2~/\S\.\.\S/{ 
         split($1,a,/\.\./); split($2,b,/\.\./); 
         printf("%s\t%s\n%s\t%s\n",a[1],b[1],a[2],b[2]); next 
     }1' file
  • -F'[[:space:]][[:space:]]+'- 字段分隔符

  • $1~/\S\.\.\S/ && $2~/\S\.\.\S/- 如果 2 个字段包含..as子项目分隔器

输出:

↔️  left-right arrow
↙️  down-left arrow
↩️  right arrow curving left
↪️  left arrow curving right
⌚   watch
⌛   hourglass done
⌨️       keyboard

相关内容