1 列に X 行あるファイルがあり、すべての偶数/奇数行を新しい列に印刷したいのですが、これは Linux またはvim
エディターで可能ですか?
例えば:
入力ファイル:
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#数値アドレス
4.2 番号による行の選択
…
first~step この GNU 拡張機能は、first 行目から始まる step 行目ごとに一致します。特に、現在の行番号が first + (n * step) に等しいような負でない n が存在する場合に行が選択されます。したがって、奇数行を選択するには 1~2 を使用し、偶数行を選択するには 0~2 を使用します。2 行目から始まって 3 行目ごとに選択するには、「2~3」を使用します。10 行目から始まって 5 行目ごとに選択するには、「10~5」を使用します。また、「50~0」は 50 を表すわかりにくい方法です。
次のコマンドは、ステップ アドレスの使用方法を示しています。
$ seq 10 | sed -n '0~4p' 4 8
$ seq 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
ファイルをディスクに書き込んで終了する (exit) ように指示します。
この方法では、隣接する行の間に空白は追加されません。そのため、(たとえば) タブを追加する必要がある場合は、既存の行の前に次の行を追加して挿入する必要がありますprintf
。
printf '%ds/$/ /\n' "$line"
置換テキスト内の空白はタブです ( , を使って入力しますControl-V) TAB。