在linux命令行中更改文本文件

时间:2017-11-29 16:01:57

标签: linux command-line

我有一个像这个例子的大文件:

#name   chrom   strand  txStart txEnd   cdsStart    cdsEnd  exonCount   exonStarts  exonEnds    proteinID   alignID
uc001aaa.3  chr1    +   11873   14409   11873   11873   3   11873,12612,13220,  12227,12721,14409,      uc001aaa.3
uc010nxr.1  chr1    +   11873   14409   11873   11873   3   11873,12645,13220,  12227,12697,14409,      uc010nxr.1
uc010nxq.1  chr1    +   11873   14409   12189   13639   3   11873,12594,13402,  12227,12721,14409,  B7ZGX9  uc010nxq.1
uc009vis.3  chr1    -   14361   16765   14361   14361   4   14361,14969,15795,16606,    14829,15038,15942,16765,        uc009vis.3

我想更改第4列。第4列中每行中的每个元素都应该替换为同一行但来自第5列的元素。我想从column5更改此元素并将其放在同一行但是在第4列中。更改将是&#34 ;(第5列的元素) - 1"。 我对linux(shell)中的命令行不太熟悉。你知道我怎么能在一行中做到这一点吗? 这是预期的输出:

#name   chrom   strand  txStart txEnd   cdsStart    cdsEnd  exonCount   exonStarts  exonEnds    proteinID   alignID
uc001aaa.3  chr1    +   14408   14409   11873   11873   3   11873,12612,13220,  12227,12721,14409,      uc001aaa.3
uc010nxr.1  chr1    +   14408   14409   11873   11873   3   11873,12645,13220,  12227,12697,14409,      uc010nxr.1
uc010nxq.1  chr1    +   14408   14409   12189   13639   3   11873,12594,13402,  12227,12721,14409,  B7ZGX9  uc010nxq.1
uc009vis.3  chr1    -   16764   16765   14361   14361   4   14361,14969,15795,16606,    14829,15038,15942,16765,        uc009vis.3

2 个答案:

答案 0 :(得分:0)

awk是一个很好的工具,可以像这样操作文件。它允许处理由字段记录组成的文件;默认情况下,记录由文件中的行定义,字段由空格分隔。执行所需操作的awk命令行是:

awk '!/^#/ { $4 = $5 - 1 } { print }' <filename>

awk程序是一系列模式 - 动作对。如果省略模式,则对所有输入记录执行操作,如果省略操作(在此程序中未使用),则默认操作是打印记录。字段在awk程序中被引用为$n,其中n是字段编号。有几种形式的模式,但这里使用的是否定一个与整个记录匹配的正则表达式。因此,此程序将第4个字段更新为第5个字段的值减1,但仅适用于不以#开头的行,以避免弄乱标题。然后对于所有记录(因为省略了图案),将打印记录。按顺序评估模式 - 动作对,以便在更新第4个字段后打印记录。

答案 1 :(得分:0)

将内容保存在文件名中     awk'{if(NR&gt; 1){$ 4 = $ 5-1; print $ 0} else {print $ 0}}'a