การใช้ sed with parallel ให้ผลลัพธ์เปล่าเมื่อเปลี่ยนเส้นทางไปยังไฟล์


3

ฉันกำลังใช้ zsh เปลือก. ฉันพยายามใช้ sed เพื่อแทนที่ข้อความในไฟล์จำนวนมากโดยใช้การขนานเพื่อเร่งความเร็วของกระบวนการ เมื่อฉันทดสอบนี้ในไฟล์เดียวและปล่อยให้คำสั่งออกไป stdout ฉันเห็นผลลัพธ์ที่คาดหวัง เมื่อฉันพยายามเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ฉันได้ไฟล์ว่างเปล่า เกิดอะไรขึ้น? นี่คือตัวอย่างเล็ก ๆ น้อย ๆ โดยใช้ไฟล์ข้อมูลที่สร้างขึ้นเพียงไฟล์เดียวที่คุณสามารถตัดและวางเพื่อแสดง ...

setopt interactivecomments
#  In this trivial example it is obviously non-sensical
#  to use parallel, but in reality I have many files...

#  Some very simple input data...
paste <(printf "%s\n" `seq 1 4`) <(printf "%s\n" `seq 1 4`) > ./input.txt
#  This looks like:
#1       1
#2       2
#3       3
#4       4


#  Pass data file to parallel and use sed to substitute.
#  e.g. want to replace line '3 3' with '3 33'
#  Output goes to stdout & seems correct...
z=`find ./input.txt`
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/"'
#1       1
#2       2
#3       33    ===> correct replacement
#4       4

# But redirecting to a file leads to empty file...
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" > {//}/result.txt'

# Empty file
cat ./result.txt

สิ่งที่ช่วยให้? ฉันกำลังระบุบางสิ่งที่ไม่ถูกต้องหรือไม่?

ฉันใช้:

  • Ubuntu 12.04.4 LTS
  • GNU parallel 20130522
  • GNU sed version 4.2.1
  • zsh 4.3.17

คำตอบ:


3

เมื่อใช้การเปลี่ยนเส้นทางภายในคำสั่งสำหรับ parallelคุณต้องใช้ {} เพื่อนำเข้าที่ถูกต้องเป็นพารามิเตอร์สำหรับ sed:

echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" {} > {//}/result.txt'

นอกจากนี้ถ้า {//} (หรือสตริงอื่นทดแทน) ถูกนำมาใช้ parallel ไม่ผนวกอินพุตที่ท้ายคำสั่งโดยอัตโนมัติ (ในกรณีนี้อาจผิดพลาดได้เหมือนเดิมหลังจากเปลี่ยนเส้นทาง)

เป็นหลักรหัสในคำถามทำงาน

sed "s/(^3.*3\)/\13/" > ./result.txt

แต่มันจะต้องเป็น

sed "s/(^3.*3\)/\13/" ./input.txt > ./result.txt

1
ไม่ถูกต้องทั้งหมด: หากมีการใช้สตริงทดแทน (เช่น {//}) ดังนั้น {} จะ ไม่ ต่อท้าย ดังนั้นรหัสจะทำงาน: sed "s / (^ 3. * 3) / \ 13 /" & gt; ./result.txt (ซึ่งเห็นได้ชัดว่าผิดด้วยใช้ - พยายามเรียกใช้เพื่อยืนยัน) ดังนั้นคำตอบของ Adaephon นั้นถูกต้อง แต่ด้วยเหตุผลที่ผิด
Ole Tange

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