偶数/奇数行を新しい列に印刷する

偶数/奇数行を新しい列に印刷する

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) を探しています。

sedgnu を使用する場合は十分です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

関連情報