awk增加一列

Linux命令:
1、awk ‘{if(NR%4 == 1){print “>” substr($0, 2)}}{if(NR%4 == 2){print}}’ fastq > fasta
注:fastq文件必须是解压格式的,不能是gz后缀的,虽然命令也能正常运行,但是查看文件的时候,发现里面的内容都是乱码的。
2、zcat input_file.fastq.gz | awk ’ NR % 4 == 1 { printf ">%s\n" , substr ( $ 0 , 2 )} NR % 4 == 2 { print } ’ > output_file.fa

awk -F ‘\t’ ‘BEGIN{OFS="\t"}{sub(/[0-9]+/,“chr”$1,$1);sub(/[0-9]+/,“chr”$4,$4);print $0}’ merged_loops.bedpe >b[数字前面加字符】
1、安装字段排序后识别字段去重: sort -n -k 2 -u facebook.txt
当设定以公司员工域进行数值排序,然后加-u后,sohu一行就被删除了!原来-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。
sort -k 4 -u output1>output2【正确输出,数字要加上n,字符千万不要加上】

2、排序后用awk去重
sort -k 4 output1 | awk ‘!a[$4]++’ >output3【正确输出,只保留一个重复字段!!!】
sort 命令还可以对行内容,先进行分割,再按照某列进行排序,这时需要用到-t 和-k 参数。
-t 参数用于设置以什么字符为分隔符,-k 参数用于以分割后的哪一列进行排序,如果没有设置,默认会按照第一列进行排序。
参数 含义
-f 将小写字母视为大写字母,即忽略大小写
-r 反向排序
-u 去重
-o 输出到文件
-n 以数字大小进行排序
-t 设置分隔符
-k 设置按照第几列排序,与-t 参数配合使用
-s, --stable
stabilize sort by disabling last-resort comparison

   -S, --buffer-size=SIZE
          use SIZE for main memory buffer

文件a内容:

1 34
1 23
1 12
2 54
2 21
3 54
3 32
3 21
4 65
4 12
5 234
5 65
5 12

想从文件a中得到第一列重复值中对应第二列的最大值和最小值。即:

最大值

1 34
2 54
3 54
4 65
5 234

最小值

1 12
2 21
3 21
4 12
5 12

一句程序的写法:

1、得到最大值:sort -s -k1n -k2nr a | awk ‘!a[$1]++’

2、得到最小值:sort -s -k1n -k2n a | awk ‘!a[$1]++’

解析:

sort命令作用是排序,参数:

-s, --stable 禁用last-resort 比较以稳定比较算法 #这里可以不使用这个参数

-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)

-n, --numeric-sort 根据字符串数值比较

-r, --reverse 逆序输出排序结果 #默认增序排列输出

awk ‘!a[$1]++’ 以第一列去重复,默认输出重复的第一个值

awk的小技巧
增加一列:::::awk ‘$0=1"\t"$0’ obs>obs1

Tin SimonCat 3月26日
一些awk

的小tips。学习B站视频<awk 18个经典案例的精讲>的笔记。

经典案例1:利用重新赋值法在一个字段中插入几个新字段
需求:在"a b c d" 的b后面插入3个字段 e f g

思路:对字符b的内容进行重新赋值,赋值的时候连接上e f g

echo “a b c d”|awk ‘{$2=$2" e g g";print}’
经典案例2:利用赋值重建实现空白格式化
需求:移除每行的前缀和后缀的空白,并且各部分要左对齐。

思路:任意一列采用原值赋值,会重建$0,因此每个字段都会用单独的空格连接,可以实现空白的格式化

echo -e " a\tb c\n a b c" |awk ‘{$1=$1;print}’
echo -e " a\tb c\n a b c" |awk ‘BEGIN{OFS="\t"}{$1=$1;print}’ filename.txt
经典案例3:多条件进行匹配筛选
限定作用域的多条件匹配

awk ‘/A06/ && !($2 ~/^(SNP|Indel)/){print $0}’
经典案例4 :根据某个字段去重
需求:去除基因的可变剪切转录本,根据基因id进行去重

思路,设定分隔符,提取出相同的部分存入数组

echo -e “Gh_A04G1356.1\nGh_A04G1356.2\nGh_A04G1376.1”|awk -F ‘.’ ‘{arr[$1]++;if (arr[$1]==1){print }}’
经典案例5:利用数组统计次数
数组名[元素名]=元素的值。

awk ‘{arr[$0]++} END{for (i in arr){print arr[i],i }}’ 1.txt
经典案例6:截取字符串
echo -e “Gh_A04G1356\tIndel\nGh_A04G1356\tSNP”|awk ‘{print $1"-"substr($2,1,3)}’
经典案例7 :利用数组实现行列转化
需求:SNP矩阵行列转化

{
for (i=1;i < NF;i++){
if (i in arr) {
arr[i]=arr[i]" "KaTeX parse error: Expected 'EOF', got '}' at position 5: i }̲else{ arr[i]=i
}
}
END{
for (i=1;i <=NF;i++){
print arr[i]
}
}
经典案例8:awk的sub替换特定域的字符串
需求;指定作用的域,使用sub函数进行替换(其中gsub可以替换所有匹配内容,gsub)

echo -e “A01\tGhA02_G003”|awk ‘{sub(/A02/,“A01”,$2);print $0}’

Linux学习系列文章是生信宝典最开始主推的一块,力图从一个新额视角帮助初学者快速入门Linux系统,熟悉Linux下的文件和目录,文件操作, 文件内容操作。而且教程摒弃了完美操作,列举出常见错误和解决方式,管道、标准输入输出解惑Linux下多种信息输出方式。

在文件排序和FASTA文件操作中简述了awk和sed的使用,作为一个引子。本篇则详细列举关于awk常用的操作和一些偏门的操作。

awk基本参数解释
awk擅长于对文件按行操作,每次读取一行,然后进行相应的操作。

awk读取单个文件时的基本语法格式是awk ‘BEGIN{OFS=FS="\t"}{print $0, $1;}’ filename。

读取多个文件时的语法是awk ‘BEGIN{OFS=FS="\t"}ARGIND1{print $0, $1;}ARGIND2{}’ file1 file2。

awk后面的命令部分是用引号括起来的,可以单引号,可以双引号,但注意不能与内部命令中用到的引号相同,否则会导致最相邻的引号视为一组,引发解释错误。

OFS: 文件输出时的列分隔符 (output field separtor)

FS: 文件输入时的列分隔符 (field separtor)

BEGIN: 设置初始参数,初始化变量

END: 读完文件后做最终的处理

其它{}:循环读取文件的每一行

$0表示一行内容;$1, $2, … $NF表示第一列,第二列到最后一列。

NF (number of fields)文件多少列;NR (number of rows) 文件读了多少行: FNR 当前文件读了多少行,常用于多文件操作时。

a[$1]=1: 索引操作,类似于python中的字典,在ID map,统计中有很多应用。

常见操作
针对特定列的计算,比如wig文件的标准化

ct@ehbio:~/sxbd$ cat ehbio.wig
variableStep chrom=chr2
300701 12.5
300702 12.5
300703 12.5
300704 12.5
300705 12.5
ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}{$2=$2*106/(2.5*106); print $0}’ wig
tep chrom=chr2 0
300701 4.4
300702 4.8
300703 4
300704 4.8
300705 4.8
计算某列内容出现的次数。

ct@ehbio:~/sxbd$ cat count
ID Type
Pou5f1 Pluripotency
Nanog Pluripotency
Sox2 Neuron
Tet1 Epigenetic
Tet3 Epigenetic
Myc Oncogene
ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}{if(FNR>1) a[$2]+=1;}END{print “Type\tCount”; for(i in a) print i,a[i];}’ count
Type Count
Neuron 1
Epigenetic 2
Oncogene 1
Pluripotency 2

这个也可以用下面方式代替,但不直接

ct@ehbio:~/sxbd$ tail -n +2 count | cut -f 2 | sort | uniq -c | sed -e ‘s/^ *//’ -e ‘s/ */\t/’
2 Epigenetic
1 Neuron
1 Oncogene
2 Pluripotency
之前也提到过的列操作,从GTF文件中提取启动子区域

sed ‘s/"/\t/g’ GRCh38.gtf | awk ‘BEGIN{OFS=FS="\t"}{if($3==“gene”) {ensn=$10; symbol=$16; if($7=="+") {start=$4-1; up=start-1000; if(up<0) up=0; dw=start+500; print $1,up, dw, ensn, symbol, $7;} else if($7=="-") {start=$5-1; up=start+1000; dw=start-500; if(dw<0) dw=0; print $1,dw,up,ensn,symbol,$7}}}’ | sort -k1,1 -k2,2n >GRCh38.promoter.bed
数据矩阵的格式化输出

ct@ehbio:~/sxbd$ cat numertic.matrix
ID A B C
a 1.002 1.234 1.999
b 2.333 4.232 0.889
ct@ehbio:~/sxbd$ awk ‘{if(FNR1) print $0; else {printf “%s%s”,$1,FS; for (i=2; i<=NF; i++) printf “%.1f %s”, $i, (iNF?RS:FS)}}’ numertic.matrix
ID A B C
a 1.0 1.2 2.0
b 2.3 4.2 0.9
判断FASTQ文件中,输出质量值的长度是与序列长度不一致的序列ID

zcat Test_2.fq.gz | awk ‘{if(FNR%41) ID=$0; else if(FNR%42) seq_len=length($0); else if(FNR%4==0) {quality_len=length($0); if(seq_len!=quality_len) print ID; }}’
筛选差异基因

ct@ehbio:~/sxbd$ cat de_gene
ID log2fc padj
A 1 0.001
B -1 0.001
C 1 0.001
D 2 0.0001
E -0.51 0.051
F 0.1 0.1
G 1 0.1

ct@ehbio:~/sxbd$ awk ‘$3<0.05 || NR==1’ de_gene
ID log2fc padj
A 1 0.001
B -1 0.001
C 1 0.001
D 2 0.0001

ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}{if(FNR==1) print $0; else {abs_log2fc=($2<0?$2*(-1):$2);if(abs_log2fc>=1 && $3<0.05) print $0;}}’ de_gene
ID log2fc padj
A 1 0.001
B -1 0.001
C 1 0.001
D 2 0.0001
筛选差异基因存储到不同的文件

ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"; up=“up”; dw=“dw”;}{if(FNR==1) {print $0 >up; print $0 >dw;} else if ($3<0.05) {if ($2>=1) print $0 >up; else if($2<=-1) print KaTeX parse error: Expected 'EOF', got '}' at position 7: 0 >dw;}̲}' de_gene ct@… head up dw
> up <
ID log2fc padj
A 1 0.001
C 1 0.001
D 2 0.0001

> dw <
ID log2fc padj
B -1 0.001
ID map,常用于转换序列的ID、提取信息、合并信息等

ct@ehbio:~/sxbd$ cat id_map
ENSM Symbol Entrez
ENSG00000280516 TMEM42 693149
ENSG00000281886 TGM4 7047
ENSG00000280873 DGKD 8527
ENSG00000281244 ADAMTS13 11093
ENSG00000280701 RP11-272D20.2
ENSG00000280674 ZDHHC3 51304
ENSG00000281623 Y_RNA
ENSG00000280479 CACFD1 11094
ENSG00000281165 SLC2A6 11182
ENSG00000281879 ABO 28
ENSG00000282873 BCL7A 605
ENSG00000280651 AC156455.1 100506691
ct@ehbio:~/sxbd$ vim ensm
ct@ehbio:~/sxbd$ cat ensm
ENSG00000281244
ENSG00000281165
ENSG00000282873
ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}ARGIND1{if(FNR>1) ensm2entrez[$1]=$3;}ARGIND2{print ensm2entrez[$1];}’ id_map ensm
11093
11182
605

替代解决方案,注意 -w的使用,避免部分匹配。最稳妥的方式还是使用awk。

ct@ehbio:~/sxbd$ grep -w -f ensm id_map | cut -f 3
11093
11182
605
转换大小写, toupper, tolower

ct@ehbio:~/sxbd$ cat symbol
Tgm4
Dgkd
Abo

ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}ARGIND1{if(FNR>1) ensm2entrez[$2]=$3;}ARGIND2{print ensm2entrez[toupper($1)];}’ id_map symbol
7047
8527
28
awk数值操作

log2对数

awk ‘BEGIN{OFS="\t";FS="\t"}{print log($0)/log(2)}’ file

取整,四舍五入

awk ‘BEGIN{OFS="\t";FS="\t"}{print int($1+0.5);}’ file
awk定义函数

awk ‘function abs(x){return ((x < 0.0) ? -x : x)}BEGIN{OFS="\t";FS="\t"}{pos[1]=$1;pos[2]=$2;pos[3]=$3;pos[4]=$4; len=asort(pos);for(i=len;i>1;i–) print abs(pos[i]-pos[i-1]);}’ file
字符串匹配

ct@ehbio:~/sxbd$ cat ens.bed
1 100 105
2 100 105
3 100 105
Mt 100 105
X 100 105
ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}{if($1~/1/) $1=“chr”$1; else if($1~/M./) gsub(/M./, “chrM”, $1); print $0}’ ens.bed
chr1 100 105
chr2 100 105
chr3 100 105
chrM 100 105
chrX 100 105
字符串分割

ct@ehbio:~/sxbd$ cat trinity_id
Trinity_C1_g1_i1
Trinity_C1_g1_i2
Trinity_C1_g1_i3
Trinity_C2_g1_i1
Trinity_C3_g1_i1
Trinity_C3_g3_i2
ct@ehbio:~/sxbd$ awk ‘BEGIN{OFS=FS="\t"}{count=split($1, geneL, ""); gene=geneL[1]; for(i=2;i<count;i++) gene=gene""geneL[i]; print gene,$1;}’ trinity_id
Trinity_C1_g1 Trinity_C1_g1_i1
Trinity_C1_g1 Trinity_C1_g1_i2
Trinity_C1_g1 Trinity_C1_g1_i3
Trinity_C2_g1 Trinity_C2_g1_i1
Trinity_C3_g1 Trinity_C3_g1_i1
Trinity_C3_g3 Trinity_C3_g3_i2
awk脚本

cat <grade.awk
f ( avg >= 90 ) grade=“A”;
else if ( avg >= 80) grade =“B”;
else if (avg >= 70) grade =“C”;
else grade=“D”;
END

awk -f grade.awk grade
awk给每行增加行号,使其变为唯一

awk ‘BEGIN{OFS="\t";FS="\t"}NR!=1{$4=$4"_"NR;print $0}’ file
糅合操作
awk中执行系统命令 (注意引号的使用)

系统命令组成字符串,交给system函数运行

awk ‘BEGIN{OFS=FS="\t"}{system(“mv “$1”.fq “$2”.fq”);}’ input_mat
awk 引用系统变量

ct@ehbio:~/sxbd$ echo 1 | awk -v ehbio=“shengxinbaodian” -v ehbio2=“SXBD” ‘{print ehbio, ehbio2;}’
shengxinbaodian SXBD

linux awk获得某一列

1、打印文件的第一列(域) : awk ‘{print 1}’ filename 2、打印文件的前两列(域) : awk ‘{print1,2}’ filename 3、打印完第一列,然后打印第二列 : awk ‘{print1 2}’ filename 4、打印文本文件的总行数 : awk ‘END{print NR}’ filename 5、打印文本第一行 :awk ‘NR==1{print}’ filename 6、打印文本第二行第一列 :sed -n “2, 1p” filename | awk ‘print1’

(获取test文件的第4行)
cat test| awk 'NR==4’或cat test|sed -n '4p’直接获取某一行的数据
shell里面的赋值方法有两种,格式为

  1. arg=(命令)
  2. arg=$(命令)
    因此,如果想要把某一文件的总行数赋值给变量nlines,可以表达为:
  3. nlines=(awk ‘END{print NR}’ filename)
    或者
  4. nlines=$(awk ‘END{print NR}’ filename)

awk练习题
wang 4
cui 3
zhao 4
liu 3
liu 3
chang 5
li 2
1 通过第一个域找出字符长度为4的
2 当第二列值大于3时,创建空白文件,文件名为当前行第一个域1 (touch1)
3 将文档中 liu 字符串替换为 hong
4 求第二列的和
5 求第二列的平均值
6 求第二列中的最大值
7 将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和
1、字符串长度
awk ‘length(1)==“4”{print1}’
2、执行系统命令
awk ‘{if(2>3){system ("touch "1)}}’
3、gsub(/r/,“s”,域) 在指定域(默认0)中用s替代r (sed ‘s///g’) awk ‘{gsub(/liu/,“hong”,1);print 0}’ a.txt 4、列求和 df -h | awk ‘{a+=2}END{print a}’
5、列求平均值
df -h | awk ‘{a+=2}END{print a/NR}’ df -h | awk ‘{a+=2;b++}END{print a,a/b}’
6、列求最大值
df -h | awk ‘BEGIN{a=0}{if(2>a) a=2 }END{print a}’
7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和
awk ‘{a[1]++;b[1]+=$2}END{for(i in a){print i,a[i],b[i]}}’

paste a b > c 将文件a,b以列的形式合并,实现按列追加;

cat a >> b 将文件a追加到文件b的尾部,可实现按行追加;

linux中给文件增加一列行号

awk ‘$0=NR" "$0’ file
$0=NR表示给文件赋值行号," " 表示行号与文件其他内容的分割符,最后一个$0表示文件其他内容
增加一行:::::awk ‘$0=1"\t"$0’ obs>obs1

Linux下为文件增加列的shell脚本

场景:linux有份文件,需要增加一列序号来标记,通过shell脚本来实现。

步骤:

1)创建一份test.txt文件,内含一列,如下:

bash-4.1$ cat test.txt
a
b
c
d
e

2)创建脚本row_id.sh,如下:
bash-4.1$ cat row_id.sh
#!/bin/sh
lines= 1 f o r ( ( i = 1 ; i < = 1 for ((i=1;i<= 1for((i=1;i<=lines;i++))
do
echo $i>>test_id.txt
done

3)执行脚本:sh row_id.sh 5
生成5行序号,如下:

bash-4.1$ cat test_id.txt
1
2
3
4
5

4)合并两份文件,执行:

paste test_id.txt test.txt > test_and_id.txt

5)查看最终结果:
bash-4.1$ cat test_and_id.txt
1 a
2 b
3 c
4 d
5 e

sed命令的语法如下所示:

sed [-nefr] [动作]
参数说明:

-n : 使用安静模式,一般所有来自STDIN的数据会被列出到屏幕上,但是 -n 在可以只列出经过 sed 处理过的那一行。

-e : 直接在命令行模式上进行 sed 的动作编辑。

-f : 直接将 sed 的动作卸载一个文件内, -f filename 则可以执行 filename 内的 sed 动作。

-r : sed 的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式语法)。

-i : 直接修改读取的文件内容,而不是由屏幕输出。

动作说明: [n1],[n2] function

n1,n2:不见得会存在,一般代表选择进行动作的行数。举例来说:如果我的动作是需要在 10 到 20 行之间进行的,则“10,20[动作行为]”

function 有下面这些参数:

a:新增,a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)。

c:替换,c 的后面可以接字符串,这些字符串可以替换n1,n2之间的行!

d:删除,因为是删除,所以 d 后面通常不接任何参数。

i:插入,i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)。

p:打印,也就是将某个选择的数据打印出来,通常 p 会与参数 sed -n 一起运行。

s:替换,可以直接进行替换工作。通常这个 s 的动作可以匹配正则表达式!例如:1,20s/old/new/g 就是。

关于 sed 的一些常见使用
以行为单位的新增或删除功能

案例(一)

nl /etc/passwd | sed ‘2,5d’
说明:

sed 的动作为 ‘2,5d’,那个 d 就是删除,命令运行的效果就是把2~5行给删除。

需要注意的是,原本应该是要执行 sed -e 才对,没有 -e 也行。

另外还需要注意的一点:sed 后面接的动作,请务必要以 ‘’ 两个单引号括住。

如果你只想删除第二行,那么命令就是:nl /etc/passwd | sed ‘2d’。

如果你想删除第三行到最后一行,那么就可以这么写:nl /etc/passwd | sed ‘3,$d’

注:$表示最后一行。

案例(二)

nl /etc/passwd | sed ‘2a drink tea’
说明:

命令执行的效果就是在第二行后面(也就是第三行)加上“drink tea”字样。

如果你想在第二行前面加上字符串,那么你可以这样:nl /etc/passwd | sed ‘2i drink tea’

注:2a 中的 a 是指第二行后面,而 2i 中的 i 则是指第二行的前面。

案例(三)

nl /etc/passwd | sed ‘2a drink tea or …
drink beer’
说明:

上面的命令的执行效果是在第二行后面加入2行字。

在每一行的后面必须要以反斜杠 来进行新行的增加。

以行为单位的替换与显示功能

案例(一)

nl /etc/passwd | sed ‘2, 5c No 2-5 number’
说明:

上面的命令的执行效果是将第2~5行的内容替换成“No 2-5 number”

案例(二)

nl /etc/passwd | sed -n ‘5,7p’
说明:

上面的命令执行的效果是仅列出文件中的第5~7行的内容。

命令中的 -n 代表的是安静模式!但是这个参数建议加上。

案例(三)

sed ‘s/要被替换的内容/新的内容/g’
说明:

以上命令执行的效果就是替换掉指定内容。

案例(四)

下面是记录一次获取IP数据的过程:

第一步:先查看源信息,利用 /sbin/ifconfig 查询 IP。

/sbin/ifconfig eth0
注:我们的目的是要获得IP数据,那么先利用关键字找出那一行。

第二步:利用关键字配合 grep 选取出关键的一行数据。

/sbin/ifconfig eth0 | grep ‘inet addr’
注:因为只需要IP数据,所以接下来就是把不需要的内容都删掉,那么就需要一个正则表达式来帮助实现:

^.*inet addr:
第三步:将 IP 前面的部分予以删除

/sbin/ifconfig eth0 | grep ‘inet addr’ |
sed ‘s/^.*inet addr://g’
注:上面的命令就把 IP 前面的数据删掉了,那么接下来就是把 IP 后面的数据也删掉,此时的正则表达式则是:

Bcast.*$
第四步:将 IP 后面的部分予以删除

/sbin/ifconfig eth0 | grep ‘inet addr’ |
sed ‘s/^.inet addr://g’ | sed 's/Bcast.$//g’
这样就能把 IP 截取出来了~~~

案例(五)

这里主要是展示 sed 与正则表达式的配合使用。

假设我想在一个文件(你自己新建或者已有的,主要是测试而已)获取MAN字样的那几行数据,但是#在内的批注我不需要,而且空白行也不要。

第一步:先使用 grep 将关键字 MAN 所在行取出来。

cat /home/man.config | grep ‘MAN’
第二步:删除掉批注之后的数据。

cat /home/man.config | grep ‘MAN’ | sed ‘s/#.*$//g’
第三步:那么接下来就是把空白行删除掉。

cat /home/man.config | grep ‘MAN’ | sed ‘s/#.*KaTeX parse error: Undefined control sequence: \ at position 8: //g' | \̲ ̲sed '^/d’
直接修改文件内容(慎重)

首先要特别提醒的是,要练习 sed 修改文件内容的时候不能用任何系统配置文件,最好是自己新建一个测试文本来测试练习。

案例(一)

sed -i ‘/s.$/!/g’ test.txt
说明:

上面命令执行效果是利用 sed 将test.txt内的每一行结尾为“.” 的换成 !

命令中的 -i 参数可以让你的 sed 直接去修改后面接的文件内容,而不是由屏幕输出。

案例(二)

sed -i ‘$a # This is a test’ test.txt
说明:

上面命令执行的效果是利用 sed 直接在test.txt最后一行加入 “This is a test”。

由于 $ 代表的是最后一行,而 a 的操作是新增,因此该文件最后新增。


  1. 0-9XY ↩︎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用awk命令来合并第一列相同的行。以下是一个例子: 假设您有一个名为“file.txt”的文件,它看起来像这样: ``` apple red banana yellow apple green orange orange banana brown ``` 您可以使用以下命令来合并第一列相同的行: ``` awk '{a[$1] = a[$1] $2 " "}END{for(i in a)print i,a[i]}' file.txt ``` 输出: ``` orange orange banana yellow brown apple red green ``` 该命令的工作原理如下: - 创建一个数组`a`,用于存储每个唯一的第一列值。 - 对于每一行,将第二列值添加到相应的数组元素中。 - 在处理完所有行后,遍历数组并输出每个数组元素。 ### 回答2: awk是一种文本处理工具,可以通过命令行进行操作。使用awk合并第一列相同的行,可以使用以下命令: awk '{arr[$1]=arr[$1]$0} END{for(i in arr) print arr[i]}' 文件名 其中,$1表示第一列,arr是一个数组,用于存储相同第一列的行。在每一行中,将当前行追加到对应的数组元素中。通过循环打印出数组中的元素,就可以合并第一列相同的行。 假设有一个名为data.txt的文本文件,其内容如下: A 1 B 2 A 3 C 4 B 5 使用上述的awk命令后,将输出: A 1 A 3 B 2 B 5 C 4 可以看到,相同第一列的行已经成功合并在一起。 ### 回答3: awk是一种用于文本处理的强大工具。要合并第一列相同的行,我们可以使用awk的数组功能来实现。 首先,我们需要创建一个数组来存储第一列的值作为索引,并将相应的行内容作为数组元素值。然后,我们可以根据数组的内容来合并行。 以下是一个示例awk脚本来合并第一列相同行的例子: ``` awk '{arr[$1] = arr[$1] $0 "\n"} END {for (i in arr) print arr[i]}' filename ``` 在这个脚本中,我们使用`arr[$1]`来创建一个以第一列值为索引的数组。然后,通过将行内容`$0`追加到数组元素值中,我们可以将具有相同索引的行合并。最后,我们通过循环遍历数组并打印合并后的行来输出结果。 请注意,上述脚本中的`filename`应替换为您要处理的文件名。 希望以上回答能够帮助您解决问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值