
単一の列にX行のファイルがあり、各偶数/奇数行を新しい列に印刷したいと思います。vim
Linuxやエディタでこれは可能ですか?
たとえば、
入力ファイル:
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
必要な出力ファイル:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
答え1
以下で試してください。
$cat a.txt
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
$ cat a.txt | sed 'N;s/\n/ /g'
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
答え2
データが z1 ファイルにあると仮定すると
paste -sd "\t\n" z1
生産します:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
そのようなシステムでは:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
頑張って...乾杯、drl
答え3
あなたは正しい場所(awkまたはsed)を探しています。
sed
gnuを使えば十分ですsed
。
バラよりhttps://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses
4.2 数字で行を選択
…
first〜stepこのGNU拡張は、最初の行から始まるすべてのステップ行と一致します。特に、現在の行番号がfirst +(n * step)に等しくなるように負でないnがある場合、行が選択されます。したがって、1~2で奇数行を選択し、0~2で偶数行を選択し、2行目から3行目を選択し、「2~3」を使用して5行目を選択します。 10行目から一度「10~5」を使い、「50~0」は50をあいまいに表現したものです。
次のコマンドは、ステップアドレスの使用を示しています。
$シーケンス10 | sed -n '0〜4p' 4 8
$シーケンス10 | sed -n '1〜3p' 1 4 7 10
答え4
奇数行に末尾の空白がある場合は、ed
スクリプトを作成できます。
{ for((line=1; line <= $(wc -l < input) / 2; line++)); do printf '%d,%dj\n' "$line" "$((line + 1))"; done; echo "wq"; } | ed -s input
再フォーマット:
{ for((line=1; line <= $(wc -l < input) / 2; line++))
do
printf '%d,%dj\n' "$line" "$((line + 1))"
done
echo "wq"
} | ed -s input
一般的なアイデアは、行数を数えて2を分割すると、印刷ed
コマンドが奇数行と偶数行を結び付けることです。 8行のサンプルファイルの場合、ループは次のed
コマンドを生成します。
1,2j
2,3j
3,4j
4,5j
最後のコマンドはファイルをディスクに書き込んで終了するように指示echo
します。ed
この方法では隣接する行の間にスペースを追加しないため、タブを追加する必要がある場合は、既存の行の前にこの行を追加してタブを挿入する必要がありますprintf
。
printf '%ds/$/ /\n' "$line"
代替テキストに表示されるスペースはタブ文字です(、で入力Control-V)TAB。