번호가 매겨진 파일을 반복하고 파일의 각 줄에 동일한 번호를 가진 다른 파일의 내용을 추가합니다.

번호가 매겨진 파일을 반복하고 파일의 각 줄에 동일한 번호를 가진 다른 파일의 내용을 추가합니다.

행 수가 다르고 *.txt 파일 수가 동일한 번호가 매겨진 *.csv 파일이 많이 있습니다. 1.txt 파일의 내용을 1.csv 파일의 각 행에 추가하고, 2.txt 파일의 내용을 2.csv 파일의 각 행에 추가하고 싶습니다. 각 *.txt 파일에는 한 줄만 포함됩니다.

내가 시도한 것:

for i in {1..2}; do for j in {1..2}; do perl -i -p -e "s/^(.+?)$/\1<content of $j.txt>/g" ./$i.csv; done; done

그러나 분명히 이것은 작동하지 않습니다.

예(초기 사례):

1.csv
  line 1
  line 2
  line 3

2.csv
  line 1
  line 2

1.txt
  yyy

2.txt
  zzz

결과(해야 함):

1.csv
  line 1yyy
  line 2yyy
  line 3yyy

2.csv
  line 1zzz
  line 2zzz

1.txt
  yyy

2.txt
  zzz

어떤 도움이라도 대단히 감사하겠습니다.

답변1

아마도 Perl을 확장해 보세요

for f in ./*.csv; do 
  perl -i -lpe 'BEGIN{$x = shift @ARGV} s/$/$x/' "$(<"${f%.csv}.txt")" "$f"
done

(연산자가 ksh/zsh/bash라고 가정하고, 쉘이 이를 지원하지 않으면 $(<file)다음으로 바꾸십시오).$(cat<file)

주다

$ head ./*.csv
==> ./1.csv <==
  line 1yyy
  line 2yyy
  line 3yyy

==> ./2.csv <==
  line 1zzz
  line 2zzz

그러나 실제로 정규식 대체가 필요하지 않습니다. s/$/$x/간단한 문자열 연결로 대체하는 것을 고려할 수 있습니다.$_ .= $x

답변2

사용 awk:

for f in *.csv; do
    awk '
        FNR==NR{txt=$0}
        FNR!=NR{printf "%s%s\n",$0,txt}
    ' "${f%.*}.txt" "$f" > "$f.csv.tmp" && mv "$f.csv.tmp" "$f"
done

산출:

$ cat a.csv
line 1yyy
line 2yyy
line 3yyy

일부 최신 구현 에는 옵션이 awk있으므로 -i inplace"tmp 및 부분"이 필요하지 않습니다 mv.이봐.

답변3

A- sed단일 라인:

for i in 1 2 ; do sed -i "s/$/$(cat $i.txt)/" $i.csv ; done

s/$/각 줄의 끝을 교체하여 줄에 추가하고 있습니다.

$(cat $i.txt)현재 번호로 명명된 텍스트 파일을 추가합니다.

filen.txt슬래시, 백슬래시, 따옴표 등과 같은 특수 문자가 포함되면 문제가 발생할 수 있습니다.

이것이 문제라면 다음을 사용하세요.ASCII 레코드 구분 기호/sed 문 보다는 . Ctrl+V를 눌러 vi​m에 이를 입력한 다음 십진수 값을 입력할 수 있습니다. --- 이 경우 030

관련 정보