0

これが簡単なことであることを願っています。

何百もの列を含むテキスト ファイルがあります。それらのうちの 8 つを (行ではなく) コピーし、それらを 5 番目、6 番目、7 番目の列に移動する必要があります。

356列のプレースホルダーを使用してawkまたはcutコマンドを書き出すのは本当に嫌です。

ありがとう!

更新 - 例:

A   B   C   D  E  F  G  ...  X  Y  Z

私が欲しいのは:

A   Y   K   L   Z   J   B   C   D   E   F   G   ...   X   Y   Z

ご協力ありがとうございました。

ああ、これらの文字は、実際にはタブで区切られた列全体を表しています。

4

3 に答える 3

0

このようないくつか?

awk '{$5=$70;$6=$35;$7=$122;$8=$190;$9=$55;$10=$200;$11=$12;$12=$67}1' file

編集: これにより、特定の列が 6 から 8 の位置に移動され、元の位置が削除されます。

cat file
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    awk '{a[++i]=$0} END {for (i=1;i<=5;i++) printf "%s ",a[i];printf "%s %s %s ",a[16],a[8],a[22];a[16]=a[8]=a[22]="";for (i=6;i<=27;i++) printf "%s ",a[i]}' RS="[ \t]" file | awk '{$1=$1}1' OFS="\t"

    A       B       C       D       E       P       H       V       F       G       I       J       K       L       M       N       O       Q       R       S       T       U       W       X       Y       Z

EDIT2: よりクリーンなバージョン

awk '
    {
    a[++i]=$0
    } 
END {
    for (i=1;i<=5;i++)
        printf "%s\t",a[i]
    printf "%s\t%s\t%s\t",a[16],a[8],a[22]
    a[16]=a[8]=a[22]=""
    for (i=6;i<=27;i++)
        if (a[i])
            printf "%s\t",a[i]
    }
    ' RS="[[:space:]]" file

EDIT3:awkこのタイプの をサポートしていない場合はRS、このソリューションを使用してください

awk '
    {
    for (i=1;i<=NF;i++)
        a[i]=$i
    } 
END {
    for (i=1;i<=5;i++)
        printf "%s\t",a[i]
    printf "%s\t%s\t%s\t",a[16],a[8],a[22]
    a[16]=a[8]=a[22]=""
    for (i=6;i<=27;i++)
        if (a[i])
            printf "%s\t",a[i]
    }
    ' file
于 2013-10-01T04:45:01.117 に答える
0

あなたのコメントによると、これはあなたのために働くかもしれません:

awk '{FS=OFS="\t"} $7=$7 FS $116 FS $119 FS $121 FS $124 FS $127 FS $129 FS $131 FS $134 FS $137 FS $140 FS $143 FS $146 FS $149 FS $152 FS $155 FS $158' inputfile

編集:ヘッダーがある場合は、次のように言うことができます:

awk 'NR>1 {FS=OFS="\t"} $7=$7 FS $116 FS $119 FS $121 FS $124 FS $127 FS $129 FS $131 FS $134 FS $137 FS $140 FS $143 FS $146 FS $149 FS $152 FS $155 FS $158' inputfile
于 2013-10-01T05:37:58.607 に答える