我有一个像这个例子的大文件:
#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
答案 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