将行转置为 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=2
到 NF
的值离开第一个字段,因为我们需要从第 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
我有一个格式如下的文件:
$ 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=2
到 NF
的值离开第一个字段,因为我们需要从第 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