행 수가 다르고 *.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를 눌러 vim에 이를 입력한 다음 십진수 값을 입력할 수 있습니다. --- 이 경우 030