ฉันจะ "ผสาน" รูปแบบในบรรทัดเดียวได้อย่างไร


10

ฉันกำลังทำ grep และ sed และฉันได้รับไฟล์ 2 บรรทัดที่ฉันสนใจฉันจะรับบรรทัดเหล่านี้ในบรรทัดเดียวที่ลงท้ายด้วยอักขระบรรทัดใหม่ได้อย่างไร
ตอนนี้ฉันได้รับ:

pattern1  
pattern2  

ฉันอยากได้ pattern1 pattern2 \n


1
คุณสามารถแบ่งปันข้อมูลตัวอย่างเพิ่มเติมได้หรือไม่
slm

ใช้ printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Valentin Bajrami

วางเป็นเครื่องมือสำหรับงานหากคุณต้องการผสานเอาท์พุทหลายบรรทัดเป็นหนึ่งเดียว
slm

เครื่องมือเฉพาะใด ๆ คุณวางแผนที่จะทำสิ่งนี้อย่างไร
Braiam

คำตอบ:


7

paste:

{...pipeline...} | paste -d " " - -

ที่กล่าวว่า: "อ่านบรรทัดจาก stdin (ที่หนึ่ง-) อ่านอีกบรรทัดจาก stdin (ที่สอง-) จากนั้นเข้าร่วมกับช่องว่าง"


เทคนิคเฉพาะทุบตี:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

ref: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile


คือ- -อะไร เป็นคำสั่งเช่นนั้นหรือไม่?
จิม

@Jim - ใช่ถูกต้อง สิ่งเหล่านี้บอกpasteวิธีที่คุณต้องการให้ประมวลผลอินพุต 2 ต่อครั้ง เพิ่มอีก 3 รายการพร้อมกัน seq 10 | paste -d " " - - .
slm

6

ฉันจะใส่วิธีที่ต่างกันสามรุ่นในแถว

AWK

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

TR

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

และยังมีอีกมากมาย


การtrแก้ปัญหาจะกลืนขึ้นบรรทัดใหม่ที่สิ้นสุดดังนั้นคุณอาจต้องการที่จะเพิ่ม; echoไปที่หนึ่ง
เกล็นแจ็

@glennjackman อ่า! ขอบคุณสำหรับคำใบ้ คุณมีอิสระที่จะแก้ไขคำตอบได้ ฉันพลาดไปนิดหน่อย!
Valentin Bajrami

2

คุณสามารถทำได้โดยใช้เชลล์สคริปต์หรือในบรรทัดคำสั่งเพียงแค่เอาท์พุทของคำสั่งในตัวแปรแล้วechoมัน:

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

ไม่มีการอ้างอิงตัวแปรนี้ยังขึ้นอยู่กับการขยายชื่อไฟล์ดังนั้นหากคุณมีอักขระ glob (เช่น*หรือ?) ในผลลัพธ์ค่าอาจเปลี่ยนแปลง
เกล็นแจ็

@glennjackman ขอบคุณที่พูดถึงสิ่งนี้เราจะแก้ไขได้อย่างไร
Nidal

@Networker โดยไม่ใช้ backticks แต่$()แทน .. และใช้ printfprintf '%s\n' "$x"
Valentin Bajrami

ฉันคาดหวังว่าprintf '%s\n' "$x"จะไม่ลบบรรทัดใหม่ "ภายใน"
เกล็นแจ็

2

ด้วยsedคุณสามารถทำสิ่งนี้:

<your previous commands> | sed '{N; s/\n/ /}'
  • N;บอกsedให้เพิ่มบรรทัดถัดไปในพื้นที่รูปแบบดังนั้นตอนนี้sedทำงานกับทั้งสองบรรทัด
  • s/\n/ / แทนที่อักขระขึ้นบรรทัดใหม่ด้วยช่องว่าง "ผสาน" สองบรรทัดเข้าด้วยกัน

2

วิธีง่ายๆในการส่งออกท่อไปยังxargs:

$ echo -e 'a\nb' | xargs
a b

ใช้งานได้กับ ouput ขนาดเล็กเท่านั้นเนื่องจากถูก จำกัด ด้วยจำนวนอักขระสูงสุดต่อบรรทัดคำสั่ง getconf ARG_MAXค่าที่มากที่สุดขึ้นอยู่กับระบบคุณจะได้รับค่านี้ใช้


1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

ไอเอฟเอจะมีความสุขที่จะกินมันถ้าคุณต้องการ


-1

ห่อ sed / grep ของคุณใน backticks

เมื่อคำสั่งดั้งเดิมของคุณคือ:

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

คำสั่งใหม่ของคุณจะเป็น:

`grep -i 'foo' mylog.log | sed 's/bar/baz/gi'`

ไม่ได้ช่องว่างระหว่างบรรทัด แต่คุณสามารถตรึงบนท่อ sed อื่นได้เสมอ:

 | sed 's/$/ /'

1
เอ่อไม่ ที่จะดำเนินการส่งออกของคำสั่ง sed
เกล็นแจ็
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.