<h2>简单<code>awk</code>脚本</h2>
<pre><code>awk -F'\t' '{OFS="\t"; if ($4=="" || $4!=old) print; old=$4}' input.txt
</code></pre>
<h2>结果</h2>
^{pr2}$
<h2>清洁</h2>
<p>为了准备我的<code>input.txt</code>文件,我复制了问题中的文本。但我不得不用制表符代替空格。因此我使用了<code>sed</code>命令。我还注意到一些尾随空格(在行尾)。最后,我使用以下<code>sed</code>命令来清理输入文件:</p>
<pre><code>sed 's/ *$//;/^[^ ]/s/ */\t/g;/^ /s/ */\t\t\t/g;' copy-fron-so.txt > input.txt
</code></pre>
<h2>来自@dogbane comment的输入文件</h2>
<pre><code>chr1 12226559 12227059 TNFRSF1B
chr1 17051560 17052060
chr1 17053279 17053779
chr1 17338423 17338923 ATP13A2
ATP13A2
ATP13A2
chr1 19577574 19578074 EMC1
MRTO4
chr1 19578046 19578546 EMC1
MRTO4
chr1 19638239 19638739 AKR7A2
PQLC2
PQLC2
PQLC2
AKR7A2
</code></pre>
<p>(最后一行已追加)</p>
<h2>清洁和加工</h2>
<pre><code>$> sed 's/ *$//;/^[^ ]/s/ */\t/g;/^ /s/ */\t\t\t/g;' copypaste.txt > input.txt
$> awk -F'\t' '{OFS="\t"; if ($4=="" || $4!=old) print; old=$4}' input.txt
chr1 12226559 12227059 TNFRSF1B
chr1 17051560 17052060
chr1 17053279 17053779
chr1 17338423 17338923 ATP13A2
chr1 19577574 19578074 EMC1
MRTO4
chr1 19578046 19578546 EMC1
MRTO4
chr1 19638239 19638739 AKR7A2
PQLC2
AKR7A2
</code></pre>
<h2>需求变更</h2>
<p>不应打印具有<code>AKR7A2</code>的最后一行。因此,我们需要首先对<code>input.txt</code>文件进行排序。注意:选项<code>-t</code>用于引入一个制表符,在<code>bash</code>或<code>vi</code>上按<code>[CTRL-V]</code>,然后<code>[TAB]</code>(在该选项卡周围加引号)。在</p>
<pre><code>$> LANG=C sort -k 4 -s -t ' ' input.txt > sorted.txt
$> awk -F'\t' '{OFS="\t"; if ($4=="" || $4!=old) print; old=$4}' sorted.txt
chr1 17051560 17052060
chr1 17053279 17053779
chr1 19638239 19638739 AKR7A2
chr1 17338423 17338923 ATP13A2
chr1 19577574 19578074 EMC1
MRTO4
PQLC2
chr1 12226559 12227059 TNFRSF1B
</code></pre>
<p>注意,现在有一行以<code>MRTO4</code>结尾!在</p>