将行转置为 bash 中第 n 列之后的列

Transpose rows to column after nth column in bash

我有一个格式如下的文件:

$ cat file_in.csv

1308123;28/01/2019;28/01/2019;22/01/2019
1308456;20/11/2018;27/11/2018;09/11/2018;15/11/2018;10/11/2018;02/12/2018
1308789;06/12/2018;04/12/2018  
1308012;unknown

如何从第二列开始转置如下:

1308123;28/01/2019  
1308123;28/01/2019  
1308123;22/01/2019  
1308456;20/11/2018  
1308456;27/11/2018  
1308456;09/11/2018  
1308456;15/11/2018  
1308456;10/11/2018  
1308456;02/12/2018  
1308789;06/12/2018  
1308789;04/12/2018  
1308012;unknown

我正在测试我的脚本,但得到了错误的结果

echo "123;23/05/2018;24/05/2018" | awk -F";" 'NR==3{a=";";next}{a=a";"}END{print a}'

提前致谢

第一个解决方案: 最简单的解决方案是循环遍历所有字段(当然,将字段分隔符设置为 ; ) 然后打印 </code> 以及新行中的所有字段。另请注意,循环是 运行 从 <code>i=2NF 的值离开第一个字段,因为我们需要从第 2 列开始在新行中打印。

awk 'BEGIN{FS=OFS=";"} {for(i=2;i<=NF;i++){print ,$i}}'  Input_file


第二个解决方案: 使用 1 次替换(sub)和全局替换(gsub)功能awk。在这里,我将 ; 的第一次出现更改为 @@@(假设您的 Input_file 不会将这些字符放在一起,以防万一选择任何唯一的字符而不是在 Input_file 中代替 @@@),然后用 ORS val(值为 $1 的变量)和 [=12= 全局替换 ;(所有出现的事件) ] 所以在新列中创建值。现在终于从第一个字段中删除 @@@ 。如果我们不将第一次出现的 ; 替换为任何其他字符,那么我们为什么要这样做,那么它会在我们不希望的替换之前放置一个新行。 (另外根据 Ed 先生的评论,此解决方案在 1 Input_file 中进行了测试,并且在读取多个 Input_file 时可能会出现问题)

awk 'BEGIN{FS=OFS=";"} {val=;sub(";","@@@");gsub(";",ORS val ";");sub("@@@",";",)} 1' Input_file

另一个 awk

awk -F";" '{ OFS="\n"  ";"; =;=""; printf("%s",[=10=]) } ' file