bash 将每三列转换为行

bash 将每三列转换为行

我有一个输入文件作为
输入文件:

a b c d e f g h
i j k l m n o p q r 
s t u v w x

我的输出应该是
输出文件:

a b c d
a b e f
a b g h
i j k l
i j m n
i j o p
i j q r
s t u v 
s t w x 

有什么命令吗?

答案1

awk -F ' ' '{for (i=3; i<=NF; i+=2) print $1" "$2" "$i" "$(i+1)}'

这是一个非常基本的字段循环。注意:

  • 如果字段少于三个,则整行将被忽略。如果您仍想打印它,请使用以下命令:

    awk -F ' ' '{if (NF<3) print; for (i=3; i<=NF; i+=2) print $1" "$2" "$i" "$(i+1)}'
    
  • 具有 3、5 或 7 个字段(或任何更高的奇数)的输入行将生成其带有尾随空格的最终输出行,就好像第 4、第 6 或第 8 个字段在输入中作为空字段存在一样。

  • 单个空格作为字段分隔符 ( -F ' ') 是一种特殊情况,可匹配一个或多个空格和/或制表符。如果您希望将两个连续的空格解释为两个分隔符(中间有一个空字段),请使用匹配单个空格的正则表达式:-F '[ ]'

  • 你提到了输入和输出文件,因此你可能需要使用重定向:

    <input_file awk … >output_file
    

    其中awk …代表您选择的命令。

相关内容