我有一個單列中有 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#Numeric-Addresses
4.2 按數字選擇行
……
first~step 此 GNU 擴充功能符合從第一個行開始的每個步驟行。特別是,當存在非負 n 使得目前行號等於first + (n * step) 時,將選擇行。因此,可以使用 1~2 選擇奇數行,使用 0~2 選擇偶數行;要從第二行開始每隔三行選取一次,將使用「2~3」;若要從第十行開始每隔五行選取一次,請使用 '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
總體思路是計算行數,將其除以二,列印ed
命令將連接奇數行和偶數行。對於八行範例文件,循環將產生以下ed
命令:
1,2j
2,3j
3,4j
4,5j
最後的echo
命令只是告訴ed
將文件寫入磁碟並退出(退出)。
此方法不會在相鄰行之間添加任何空格,因此如果您需要添加(比如說)一個選項卡,那麼您需要透過在現有的之前添加此行來插入它printf
:
printf '%ds/$/ /\n' "$line"
您在替換文字中看到的空格是製表符(使用 , 輸入Control-V)TAB。