әрбір екінші жолды awk арқылы жаңа бағанға жылжыту

Міне, тағы бір сұрақ. Менде осындай файл бар

John
30
Mike
0.0786268
Tyson
0.114889
Gabriel
0.176072
Fiona
0.101895

Әрбір екінші жолды жаңа бағанға жылжытуым керек, осылайша ол осындай болуы керек

John   30
Mike   0.0786268
Tyson  0.114889
Gabriel 0.176072
Fiona   0.101895

Мен енді тек awk 'NR% 2 == 0' әр екінші жолды басып шығарады, біреуі оларды жоғарыда көрсетілгендей жаңа бағаға қалай ауысуға болатынын ұсынуы мүмкін. Кез келген көмек ең жоғары бағаланады.

5
Байланысты, бірақ арнайы емес: stackoverflow.com/questions/8522851/…
қосылды автор Michael J. Barber, көзі

7 жауаптар

awk '{printf "%s%s",$0,(NR%2?FS:RS)}' file

Түсіндіру:

  • printf will not include a new line character at the end of line (unlike print)
  • (NR%2?FS:RS) decides new line (RS) or field seperator (FS) based on NR%2

If your colmns should be seperated by \t

awk '{printf "%s%s",$0,NR%2?"\t":RS}'
7
қосылды
Бұл шешім FS және RS әдепкі параметрлеріне негізделеді, бұл сәйкесінше кеңістік және жаңа сызық.
қосылды автор Tom, көзі
+1 Бұл керемет.
қосылды автор jaypal singh, көзі
Бұл AWK-тің тамаша және талғампаз бейнесі. Басқа шешімдер жақын емес.
қосылды автор Greg A. Woods, көзі
Бұл маған көмектесті. Рахмет @ ed-Morton
қосылды автор Hsehdar, көзі

xargs мұны істей алар еді, командалық жол өте қысқа:

xargs -n2 < file
3
қосылды

Мұның бір жолы:

awk '{ printf("%-10s ",$0); if(NR%2==0) printf("\n");}' file

Оны қараңыз

1
қосылды
printf функциясы емес, функция емес, сондықтан() олар сіз ойлаған нәрселерді жасамайды, соңында жартылай колонна өте көп және жаңа жолды басып шығару тәсілі print «» болып табылады.
қосылды автор Ed Morton, көзі
printf жаңа сызықсыз басып шығарады және % s - жолдың пішім сипаттамасы. % - 10s 10 ұзындыққа бос орын береді, сол жаққа ақталса немесе ұзын жолды қысқартады. Керісінше, printf («% s», $ 0) орнына% s кейінгі бос орынмен, ал \ t .
қосылды автор tripleee, көзі
Бір лайнерге рақмет, бұл шынымен жақсы жұмыс істейді. Мен awk-ны үйрене бастадым және сізден бірнеше сұрақ қоя алсам, printf («% -10s», $ 0) сызықтағы барлық нәрселерді басып шығарады деп ойлаймын, бірақ кейіннен түсінбеймін. Тағы да рахмет.
қосылды автор Amit, көзі

Мен келесідей sed пайдалануды ұсынамын:

sed 'N;s/\n/ /' file

Дегенмен, бұл сіздің деректеріңізді жақсы пішімдеуге мүмкіндік бермейді. Сіз оны column -t ішіне сала аласыз:

< file sed 'N;s/\n/ /' | column -t

Бірақ бұл қажет емес. Келесі кодты paste қолданған жөн:

paste - - < file

Нәтижелері:

John    30
Mike    0.0786268
Tyson   0.114889
Gabriel 0.176072
Fiona   0.101895
1
қосылды
Рахмет, бұл паста арқылы жасалатынын білмеді
қосылды автор Amit, көзі

мұны awk-ға қарағанда жақсы істеу керек:

sed 'N;s/\n/ /g' yourfile

сондай-ақ awk:

awk '{if(NR%2!=0){p=""}else{p="\n"};printf $0" "p}' your_file

also check another solution here

0
қосылды
sed бұл awk қарағанда қарағанда жақсы емес, өйткені бұл тіпті awk қалай жасауға болады жақын.
қосылды автор Ed Morton, көзі
рахмет, сіз очарование ретінде жұмыс істейді
қосылды автор Amit, көзі
paste - - < file > newfile

қойындыны әдепкі бойынша бөлгіш ретінде пайдаланады.

0
қосылды
awk 'NR%2{s=$0; next} {print s, $0}' file

or using default action

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file
0
қосылды