[英]Replace values from other columns if value of one column is null using 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
腳本可以解決問題,交換name
和id
:
{
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.