簡體   English   中英

使用awk或sed重新排列具有空值的列

[英]Rearrange column with empty values using awk or sed

我想重新排列txt文件的列,但是有空值,這會引起問題。 例如:

測試文件:

Name    ID      Count   Date    Other
A       1       10      513     x
        6       15      312     x
        3       18      314     x
B       19      31      942     x
        8       29      722     x

當我嘗試使用$ more testfile |awk '{print $2"\\t"$1"\\t"$3"\\t"$4"\\t"$5}'它變成:

ID      Name    Count   Date    Other
1       A       10      513     x
15      6       312     x
18      3       314     x
19      B       31      942     x
29      8       722     x

這不是我想要的,請幫助,我希望它成為

ID      Name    Count   Date    Other
1       A       10      513     x
15              6       312     x
18              3       314     x
19      B       31      942     x
29              8       722     x

此外,我不確定哪些列可能包含空值,並且列長不固定,謝謝

假設您的輸入文件不是用制表符分隔的,並且您具有(或可以獲得)GNU awk,那么我建議:

$ awk -v FIELDWIDTHS="8 8 8 8 8" -v OFS='\t' '{
    for (i=1;i<=NF;i++) {
        gsub(/^\s+|\s+$/,"",$i)
    }
    t=$1; $1=$2; $2=t'
}1' file
ID      Name    Count   Date    Other
1       A       10      513     x
6               15      312     x
3               18      314     x
19      B       31      942     x
8               29      722     x

如果您的文件用制表符分隔,則您需要做的是:

awk 'BEGIN{FS=OFS="\t"} {t=$1; $1=$2; $2=t}1' file

awk使用的最自然的模型是列,該列由從空白到非空白以及向后過渡的過渡定義。 由於您自己的列本身可能是空白,因此自然模型將不起作用。

但是,您可以恢復使用基於列位置而非過渡的模型,這意味着僅包含空格的文件(制表符的存在會使情況變得復雜):

Name    ID      Count   Date    Other
A       1       10      513     x
        6       15      312     x
        3       18      314     x
B       19      31      942     x
        8       29      722     x

仍然可以重新排列,盡管不如基於過渡的列那么簡潔。

下面的awk腳本可以解決問題,交換nameid

{
    name  = substr($0, 1,7);
    id    = substr($0, 9,7);
    count = substr($0,17,7);
    date  = substr($0,25,7);
    other = substr($0,33  );
    print id" "name" "count" "date" "other;
}

如果原始文件名為pax.in並且awk腳本存儲在pax.awk ,則命令awk -f pax.awk pax.in將根據需要提供:

ID      Name    Count   Date    Other
1       A       10      513     x
6               15      312     x
3               18      314     x
19      B       31      942     x
8               29      722     x

請記住,我已經將該腳本編寫為相對靈活的腳本,使您可以輕松更改列的順序。 如果只想交換前兩列,則可以使用:

awk '{print substr($0,9,8)substr($0,1,8)substr($0,17)}' qq.in

或稍短一些(如果允許使用其他工具):

sed -E 's/^(.{8})(.{8})/\2\1/' qq.in

另一個awk替代方法是使用字段數。 如果您知道自己的數據,並且僅是第一列中的不足,可以嘗試一下。

awk -v OFS="\t" 'NF==4{$5=$4;$4=$3;$3=$2;$2=$1;$1=""} {print $2,$1,$3,$4,$5}'

但是,輸出將以制表符分隔,而不是固定長度格式。 您可以使用printf和更改OFS來實現相同的目的,但是制表符分隔可能是您真正需要的表格表示形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM