我有一个格式为以下的文件:
⌚..⌛ 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
答案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