Sed替换没有标头的多个tsv文件的第n列

时间:2018-04-14 16:33:00

标签: awk sed

这里有多个tsv文件,我想在第二列中添加“XX”字符(标题除外),并将其保存到同一个文件中。

输入:

$ls
file1.tsv file2.tsv file3.tsv

$head -n 4 file1.tsv
a   b   c
James England  25
Brian France   41
Maria France   18

Ouptut想要:

a   b   c
James X1_England  25
Brian X1_France   41
Maria X1_France   18

我尝试了这个,但结果没有保存在文件中,并且简单的重定向不起作用:

   # this works, but doesn't save the changes 
    i=1
    for f in *tsv
      do awk '{if (NR!=1) print $2}’ $f | sed "s|^|X${i}_|" 
      i=$((i+1))
    done

    # adding '-i' option to sed: this throws an error but would be perfect (sed no input files error)
    i=1
    for f in *tsv
      do awk '{if (NR!=1) print $2}’ $f | sed -i "s|^|T${i}_|" 
      i=$((i+1))
    done 

一些帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

第二列特别容易,因为您只需替换第一个出现的分隔符。

for file in *.tsv; do
    sed -i '2,$s/\t/\tX1_/' "$file"
done

如果您的sed无法识别符号\t,请使用文字标签(在许多shell中,您使用 ctrl v < / kbd> tab 。)在* BSD(以及MacOS)上你需要-i ''

答案 1 :(得分:1)

AWK解决方案:

awk -i inplace 'BEGIN { FS=OFS="\t" } NR!=1 { $2 = "X1_" $2 } 1' file1.tsv

输入:

a   b       c
James       England 25
Brian       France  41
Maria       France  18

输出:

a   b       c
James       X1_England      25
Brian       X1_France       41
Maria       X1_France       18