使用bash创建包含data中现有列的子字符串的新列



我有一个大的tsv.gz文件(40GB),我想从现有的变量col3中提取一个字符串,将其存储在一个新的变量New_var中(放在开头),并将所有内容保存在新文件中。数据"old_file.tsv.gz">

的示例
col1  col2  col3  col4
1  positive  12:1234A  100
2  negative  10:9638B  110
3  positive  5:0987A  100
4  positive  8:5678A  170

所需数据"new_file.tsv.gz">

New_var  col1  col2  col3  col4
12  1  positive  12:1234A  100
10  2  negative  10:9638B  110
5  3  positive  5:0987A  100
8  4  positive  8:5678A  170

我是bash的新手,所以我尝试了很多东西,但我被卡住了,我尝试过

zcat old_file.tsv.gz | awk '{print New_var=$3,$0 }' | awk '$1 ~ /^[0-9]:/{print $0 | (gzip -c > new_file.tsv.gz) }'

我想我有很多问题。{print New_var=$3,$0 }确实创建了col3的副本,但没有重命名它。然后,当我添加代码awk '$1 ~ /^[0-9]:/{print $0 | (gzip -c > new_file.tsv.gz) }'的最后一部分…好吧,什么也没有出现(我试着看看我是否忘记了括号,但找不到问题)。我也不确定这种方法是否是最好的方法。知道怎么做吗?

在单独的文件中创建AWK脚本(为了可读性),例如1.awk:

{ if (NR > 1) { 
# all data lines 
split($3, a, ":");  
print a[1], $1, $3, $3, $4; 
} else {
# header line
print "new_var", $1, $2, $3, $4;
} 
}

现在用AWK文件处理输入(比如1.csv.gz):

zcat 1.csv.gz | awk -f 1.awk | gzip -c > 1_new.csv.gz

我建议使用一个制表符(t)和:作为输入字段分隔符:

awk 'BEGIN { FS="[t:]"; OFS="t" }
NR==1 { $1="New_var" OFS $1 }
NR>1  { $0=$3 OFS $0 }
{ print }'

为一行:

awk 'BEGIN{ FS="[t:]"; OFS="t" } NR==1{ $1="New_var" OFS $1 } NR>1{ $0=$3 OFS $0 } { print }'

参见:8个强大的Awk内置变量-FS,OFS, rs, ors,nr, NF, FILENAME, FNR

相关内容

  • 没有找到相关文章

最新更新