【问题标题】:Edit text format with shell script使用 shell 脚本编辑文本格式
【发布时间】:2012-08-03 23:58:09
【问题描述】:

我正在尝试制作一个用于文本编辑的脚本。在这种情况下,我有一个名为 text.csv 的文本文件,内容如下:

first;48548a;48954a,48594B
second;58757a;5875b
third;58756a;58576b;5867d;56894d;45864a

我想把文本格式变成这样:

first;48548a
first;48954a
first;48594B
second;58757a
second;5875b
third;58756a
third;58576b
third;5867d
third;56894d
third;45864a

我应该使用什么命令来实现这一点?

【问题讨论】:

  • 在您的第一行输入数据中,最后一个分隔符应该是逗号还是分号?或者你想接受 either 字符作为分隔符吗? (答案可能会影响使用工具拆分数据的方式。)
  • 嗨 Jordanm,我只是尝试使用 awk 命令,但我知道如何实现它,这就是为什么我问我应该使用什么命令.. :D .. 顺便谢谢你帮助

标签: bash shell command-line command-line-interface sh


【解决方案1】:
while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   printf "$id;%s\n" "${data[@]}" 
done < input.txt

awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}'

还有

$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt

感谢大家的建议,:d。真的是让我有了新的认识。。

【讨论】:

  • 如果您要回答自己的问题,它应该包括一些尚未作为答案发布的内容。而不是重新发布答案,您应该对它们进行投票并选择一个“接受”。请阅读FAQ
【解决方案2】:

这是一个纯 bash 解决方案,可以同时处理 ,;

while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   for item in "${data[@]}"; do 
      printf '%s;%s\n' "$id" "$item" 
   done
done < input.txt

已更新 - 基于 chepner 建议的替代打印方法:

while IFS=';,' read -a data; do 
   id="${data[0]}"
   data=("${data[@]:1}")
   printf "$id;%s\n" "${data[@]}" 
done < input.txt

【讨论】:

  • printf "$id;%s\n" "${data[@]}";不需要 for 循环。
  • @chepner - 这是一个很好的建议。我通常不喜欢在 printf 的格式字符串中扩展变量,但它确实节省了一个循环。
【解决方案3】:

awk -v FS=';' -v OFS=';' '{for (i = 2; i &lt;= NF; ++i) { print $1, $i }}' 说明: awk 隐式地将数据拆分为记录(默认情况下由换行符分隔,即 line == 记录),然后通过给定的字段分隔符将其拆分为编号的字段(FS 用于输入字段分隔符,OFS 用于输出分隔符)。 对于每条记录,此脚本会打印第一个字段(即记录名称)以及第 i 个字段,这正是您所需要的。

【讨论】:

    【解决方案4】:

    我会在 awk 中执行此操作。

    假设您的第一行应该有 ; 而不是 ,

    $ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt
    

    未经测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 2016-08-10
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多