awk
Pendekatan alternatif :
$ awk 'NR == 1{printf "%s", $0;next}{printf " %s\n%s", $1,$0}' input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
Cara kerjanya sederhana: baris pertama adalah huruf khusus - kami mencetaknya tanpa baris baru, dan meminta awk untuk membuka baris berikutnya tanpa mengeksekusi blok kode lain. Setelah itu, NR == 1{printf "%s", $0;next}
dilewati, tetapi bagian lain melakukan pekerjaan.
Ingat bahwa hingga sekarang kami mencetak string yang diformat tanpa karakter baris baru. Jadi, apa yang sedang dilakukan printf " %s\n%s",$1,$0
sekarang adalah kata pertama dicetak (dan karena tidak ada baris baru, itu tetap pada baris output yang sama), baris baru dimasukkan, dan kemudian seluruh baris itu sendiri (tetapi tidak berakhir dengan karakter baris baru) . Dengan demikian kata pertama yang dimasukkan berikutnya akan tetap berada pada baris yang sama. Proses berlanjut dan terus sampai kita mencapai akhir file.
Kemungkinan peningkatan adalah memasukkan END{print ""}
blok untuk memasukkan baris terakhir. Dalam kasus tertentu di mana file yang dihasilkan akan diproses oleh skrip lain mungkin diinginkan.
Sementara pengguna meminta AWK secara khusus, pendekatan yang sama dengan mencetak string yang diformat dapat diambil dengan bahasa lain, misalnya Python. Alternatif Python disediakan bagi mereka yang penasaran tentang bagaimana ini dapat diimplementasikan dalam bahasa lain:
#!/usr/bin/env python
from __future__ import print_function
import sys
old = None
for index,line in enumerate(sys.stdin):
if index == 0:
print(line.strip(),end=" ")
continue
words = line.strip().split()
print(words[0] + "\n" + line.strip(),end=" ")
Dan penggunaannya seperti ini:
$ ./append_first.py < input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
Gagasan yang sama tentang baris terakhir final juga berlaku di sini.
sed
sendiri tanpapaste
:sed -r 'N;s/\n(\w+)/\1&/;P;D' somefile.txt