【问题标题】:Processing elements in each line into multiple lines将每行中的元素处理成多行
【发布时间】:2017-08-30 22:11:44
【问题描述】:

我在处理一个文件时需要帮助,该文件包含多行以逗号分隔的元素。该文件如下所示:

文件-1.txt

54, 75, 19, 123, 74, 15, 10, 117 
54, 75, 19, 45, 74, 15, 10, 117 
54, 29, 19, 123, 74, 15, 10, 117 
54, 29, 19, 45, 74, 15, 10, 117  

我想将每一行的逗号分隔值转换成tab分隔的两列,如下图:

输出文件:

54  75
75  19
19  123
123 74
74  15
15  10
10  117

同样,每一行保存到一个单独的文件中,以原始行的第一个和最后一个数字命名,后跟行号,如下所示

输出文件 1

ABC-54_117-1

54  75
75  19
19  123
123 74
74  15
15  10
10  117

输出文件 2

ABC-54_117-2

54  75
75  19
19  45
45  74
74  15
15  10
10  117 

其他两行也以此类推。在这种情况下,它是一个文件中的 4 行,但我的文件很少,行数很多,需要以相同的方式处理。我尝试了 awk、sed 的脚本,但根本无法破解。

任何帮助将不胜感激。

【问题讨论】:

  • 为什么第一行中的117 在第一列中缺失?和54 来自第二行的第二列缺少
  • 它没有丢失,我想要以这种方式排列的值。为了更清楚,我希望该行的元素如下:A B,B C,C D,D E 进入不同的行
  • 将您的尝试作为问题的一部分发布。

标签: bash awk sed


【解决方案1】:

完整的解决方案是:

awk -F, '{ cnt++;for (i=1;i<=7;i++) { system("echo \""$i" "$(i+1)"\" >> \"ABC-"$1"_"gensub(" ","","g",$8)"_"cnt"\"") } }' File-1.txt

我们首先为 File-1.txt 中的每条记录增加 cnt。我们知道每行有 8 个逗号分隔字段,因此我们使用一个 for 循环,进行 8 次迭代,并在循环内使用系统命令将变量对回显到由 cnt 变量和第 8 个分隔字段构造的文件中。函数 gensub 用于删除第 8 个字段中的所有空格。

【讨论】:

    【解决方案2】:

    你可以使用这个awk

    awk -F', +' '{f=$1"_"$NF"_"NR; for (i=1; i<NF; i++){print $i,$(i+1)>f}}' OFS='\t' file
    

    输出:

    $ ls
    54_117_1  54_117_2  54_117_3  54_117_4
    
    $ cat 54_117_2
    54  75
    75  19
    19  45
    45  74
    74  15
    15  10
    10  117
    

    【讨论】:

    • 非常感谢。此脚本已根据需要生成输出。
    猜你喜欢
    • 2021-05-20
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多