我有一个大的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